Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   Помощь новичку с простеньким greasemonkey скриптом (https://javascript.ru/forum/css-html-firefox-mizilla/65280-pomoshh-novichku-s-prostenkim-greasemonkey-skriptom.html)

bombino1 09.10.2016 21:37

Помощь новичку с простеньким greasemonkey скриптом
 
Привет всем! требуется из исходника страницы узнать значения переменных 'id', 'Name', 'ds' (в моем примере - "aaa", "bbb", "ccc"):



<script type="text/javascript">
var chatData__ = {id:'aaa',Name:'bbb',ds:'ccc'};



Затем извлеченные значения переменных суём в URL и открываем получившийся адрес в новой вкладке. "www.mysite.com/script.php?id=aaa&name=bbb&ds=ccc"

Пробовал использовать команды getElementById() getElementsByName() getElementsByTagName() но ничего не получилось. Спасибо

Aetae 09.10.2016 23:02

// ==UserScript==
// @name        chatData__
// @namespace   w*!**/!*ww.mysite.com
// @include     ht*!**/!*tp://ww*!**/!*w.mysite.com/*
// @version     1
// @grant       GM_openInTab
// @grant       unsafeWindow
// @run-at      document-start
// ==/UserScript==
var interval = setInterval( function(){
  if('chatData__' in unsafeWindow){
    clearInterval(interval);
    let {id,Name,ds} = unsafeWindow.chatData__;
    GM_openInTab(`http://www.mysite.com/script.php?id=${id}&name=${Name}&ds=${ds}`)
  }
}, 10);
Примерно так.

bombino1 09.10.2016 23:34

спасибо за помощь и время!

не удалось почему-то заставить работать. Попробуйте, может проблема на моей стороне. Скрипт чутка переделал по части имен переменных и URL-a

http://pastebin.com/#######

html source: https://www.dropbox.com/s/cx4csksn33...reeam.zip?dl=0

А что делает интервал в 10 миллисекунд и зачем clearinterval, интересно

bombino1 09.10.2016 23:47

ой, Друже, все работает!

// @grant GM_openInTab
// @grant unsafeWindow
// @run-at document-start


эти строки забыл добавить в префикс. Спасибоооо

Aetae 10.10.2016 01:15

С интервалом в 10 мс скрипт проверяет наличие переменной(потому что она появляется не сразу, а как подгрузятся нужный скрипт), и как только оная найдена - останавливает проверку(clearinterval) и открывает страничку.

bombino1 11.10.2016 17:46

Aetae: привет снова! Не проверите ли мой новый скрипт на ошибки, что-то не работает.

Задача поменять все ссылки где есть waitingroom, на мои:

<div class="HLImageContainer" data-url="/waitingroom/Vasya">

поменять на

<div class="HLImageContainer" data-url="/videochat/Vasya?from=wr">

я написал подобный greasemonkey скрипт, на https://regex101.com/ проверил regex формулу замены, работала отлично. У меня подозрение что в скрипте ошибка где-то в строке TagName("a") ведь моя искомая ссыль не а href.

// ==UserScript==
// @name fromWR
// @namespace mysite
// @include http://mysite.com*
// @version 1
// @grant none
// ==/UserScript==
var links = document.getElementsByTagName("a"); //array
var regex = /^(waitingroom\/)(.+)/ig;
for (var i=0,imax=links.length; i<imax; i++) {
links[i].href = links[i].href.replace(regex,"videochat/$2/?from=wr");
}

рони 11.10.2016 18:07

bombino1,
Знаете ли вы селекторы?
Селекторы атрибутов

querySelectorAll

прочитайте пожалуйста там по 10 строк всего

Aetae 11.10.2016 18:17

А ещё что такое вообще свойства и атрибуты.

bombino1 11.10.2016 18:36

var links = document.getElementsByTagName("data-url");
var links = document.getElementsById("data-url");
var links = document.getElementById("data-url");

попробовал, тот же эффект. Шайзе( Ну да ладно, брошу это дело. Про Атрибуты и DOM (который построил Джек) пытался прочесть но ничего не понял.

Lemme 11.10.2016 18:49

querySelectorAll

Aetae 11.10.2016 19:05

// ==UserScript==
// @name fromWR
// @namespace mysite
// @include ht*!**/!*tp://mysite.com*
// @version 1
// @grant none
// ==/UserScript==
document.querySelectorAll('[data-url^="/waitingroom/"]').forEach(
    ({dataset}) => dataset.url = dataset.url.replace('/waitingroom/', '/videochat/') + '?from=wr'
)

рони 11.10.2016 19:05

Lemme,
что не так?

bombino1 11.10.2016 19:47

Aetae: спасибо за помощь, всё вроде проверил, но линки и с Вашим скриптом не меняются. Неудобно отвлекать больше своим ньюбовскими проблемами. В личку отписался.

Lemme 11.10.2016 20:16

рони, в том, что ТСу лень ссылку открыть, или, хотя бы - глаза. Если показалось, что я что-то имею против - querySelector, то это не так, напротив, только его и использую.


Цитата:

Сообщение от рони (Сообщение 431321)
bombino1,
Знаете ли вы селекторы?
Селекторы атрибутов

querySelectorAll

прочитайте пожалуйста там по 10 строк всего

Цитата:

Сообщение от bombino1 (Сообщение 431323)
var links = document.getElementsByTagName("data-url");
var links = document.getElementsById("data-url");
var links = document.getElementById("data-url");

попробовал, тот же эффект. Шайзе( Ну да ладно, брошу это дело. Про Атрибуты и DOM (который построил Джек) пытался прочесть но ничего не понял.

Цитата:

Сообщение от Lemme (Сообщение 431325)
querySelectorAll


Lemme 11.10.2016 20:23

bombino1,
document.querySelectorAll('[data-url^="/waitingroom/"]')

заменить на
Array.from(document.querySelectorAll('[data-url^="/waitingroom/"]'))

рони 11.10.2016 20:46

// ==UserScript==
// @name fromWR
// @namespace mysite
// @include [url]http://mysite.com*[/url]
// @version 1
// @grant none
// ==/UserScript==
[].forEach.call(document.querySelectorAll('[data-url^="/waitingroom/"]'),
    dataset => dataset.url = dataset.url.replace('/waitingroom/', '/videochat/') + '?from=wr'
)

рони 11.10.2016 20:48

Aetae,
какие теги для форматирования использовать, чтоб ссылки не ломало?

bombino1 11.10.2016 21:06

спасибо друзья, всё работает, Aetae помог ибо страница была непростая, самообновляемая, и посему не работало по стандартной схеме.

Aetae 11.10.2016 21:25

Цитата:

Сообщение от Lemme (Сообщение 431336)
Array.from(document.querySelectorAll('[data-url^="/waitingroom/"]'))

Тогда уж сразу
Array.from(
    document.querySelectorAll('[data-url^="/waitingroom/"]'),
    ({dataset}) => dataset.url = dataset.url.replace('/waitingroom/', '/videochat/') + '?from=wr'
)
Зачем лишний оверхед?)


Цитата:

Сообщение от рони (Сообщение 431342)
[].forEach.call(document.querySelectorAll('[data-url^="/waitingroom/"]'),
    dataset => dataset.url = dataset.url.replace('/waitingroom/', '/videochat/') + '?from=wr'
)

Предполагается что у тс фурифокс, а тот умеет forEach для всех и можно не разрушать эстетику лишними телодвижениями.)
Кстати у тебя ошибка, не dataset, а ({dataset}) - деструктуризация объекта.
Цитата:

Сообщение от рони (Сообщение 431344)
Aetae,
какие теги для форматирования использовать, чтоб ссылки не ломало?

Хе хе, просто делаю так: "ht*!**/!*tp"(мог бы сам через "цитату" подсмотреть). Костыли такие костыли.)

P.S. А "проблему" просто через подмену ссылки по mousedown порешал.

рони 11.10.2016 21:34

Aetae,
ок!

Lemme 11.10.2016 21:52

Цитата:

Сообщение от Aetae (Сообщение 431355)
Тогда уж сразу
Array.from(
    document.querySelectorAll('[data-url^="/waitingroom/"]'),
    ({dataset}) => dataset.url = dataset.url.replace('/waitingroom/', '/videochat/') + '?from=wr'
)
Зачем лишний оверхед?)

А вот это уже прикольно, не знал про

Код:

mapFn
    Optional. Map function to call on every element of the array.

Цитата:

Предполагается что у тс фурифокс, а тот умеет forEach для всех и можно не разрушать эстетику лишними телодвижениями.)
А у меня не умеет ;)

Ubuntu 16.04
Firefox 49.0

Aetae 11.10.2016 22:05

Цитата:

Сообщение от Lemme (Сообщение 431359)
Неа. у меня не умеет ;)

Вот гад.=\
Значит это фича dev edition, буду знать.

Lemme 11.10.2016 22:09

Aetae, я думал, что уdev edition только devtools расширенный.

p.s нужно скачать;)

Aetae 11.10.2016 22:17

Lemme, нет, я ещё на что-то такое напарывался уже. Правда не помню на что.)
Единственная причина для меня пересесть на dev - возможности юзать неподписанные расширения. Люблю тюнить под себя, а при каждом чихе подписывать запаришься.

Rise 11.10.2016 22:42

Цитата:

Сообщение от Aetae (Сообщение 431363)
возможности юзать неподписанные расширения.

А что окончательно прикрыли такую возможность в настройках никак не включить? А в dev тоже надо в настройки лезть или там сразу разрешено?

Aetae 11.10.2016 22:57

Цитата:

Сообщение от Rise (Сообщение 431365)
А что окончательно прикрыли такую возможность в настройках никак не включить?

А хз, честно говоря, я пересел когда только грозились.)
Цитата:

Сообщение от Rise (Сообщение 431365)
А в dev тоже надо в настройки лезть или там сразу разрешено?

Надо: xpinstall.signatures.required;false

Lemme 11.10.2016 23:02

Блин, хоть devtools не вырви глаз).

И да, насчет forEach у NodeList

document.qurySelectorAll('div').__proto__

// common
NodeListPrototype { item: item(), length: Getter, 1 more… }

// dev edition
NodeListPrototype { item: item(), keys: keys(), values: values(), entries: entries(), forEach: forEach(), length: Getter, 1 more… }


Похоже на Map ;), только delete, clear, size нету ).

Rise 11.10.2016 23:14

Aetae, ясно спасибо

Rise 12.10.2016 14:44

Aetae, оказывается появилось решение и для обычных версий проверил в последней работает :)

bombino1 18.01.2017 18:25

привет, какой командой можно в greasemonkey выцепить значения переменных "data-hostid", "data-nickname"? Пробовал
let {data-hostid,data-nickname} = unsafeWindow.videoParams;
- переменная оказывалась пустая

рони 18.01.2017 18:38

bombino1,
Свойство dataset, data-атрибуты

bombino1 18.01.2017 19:25

Рони, спасибо. Попробовал по инструкции:
alert( videoParams.dataset.nickname ); - pop up не вылез, ничего не произошло, но по f12 в консоли эта же строка выдала корректный ответ! видимо тут дело в срабатывании скрипта ДО прогрузки страницы? поиграю с settimeout

UPD: setinterval помог!

рони 18.01.2017 19:33

bombino1,
возможно элемента ещё нет на странице

bombino1 18.01.2017 19:53

спасибо, все заработалo, setinterval 30ms помог!

bombino1 19.12.2018 17:53

помогите понять в чем ошибка dataset:
имеем код страницы:
<input id="vc-api-params" type="hidden"
 data-host-name="Nic"
 data-host-id="13402"
 data-host-ws="cdnnc://c-t6-bintu-stream-eu~nanocosmos~de/atrans.fly2"


пытаюсь присвоить своим переменным данные из этого куска:
var interval = setInterval( function(){
  if('vc-api-params' in unsafeWindow){
    clearInterval(interval);
    
    let hostNickName=vc-api-params.dataset.hostName;
    let hostid=vc-api-params.dataset.hostId;
    let ws=vc-api-params.dataset.hostWs;
   
    window.location.replace(`http:/mysite.com/Player.swf?hid=${hostid}&h=${hostNickName}&ws=${ws}`)
  }
}, 20);



и ничего не происходит, подозреваю что дефис имени vc-api-params ему не нравится, но смена на vcApiParams также не помогла. Ошибка точно в строках let, ибо если задать переменным численное значение вручную - всё выполняется.

еще надо оставить от ссылки cdnnc://c-t6-bintu-stream-eu~nanocosmos~de/atrans.fly2 лишь концовку - fly2 (вместо 2 может быть любое двухзначное число), надо в переменную ws добавить regex (\w+)$ но не получается
Спасибо!

рони 19.12.2018 18:48

bombino1,
let hostNickName = unsafeWindow['vc-api-params'].dataset.hostName;

bombino1 19.12.2018 19:02

огромное спасибо, фунциклирует! плюсик улетел

bombino1 19.12.2018 20:17

дано: нужно вырезать из ссылки cdnnc://c-t6-bintu-stream-eu~nanocosmos~de/atrans.fly20 последнюю часть - fly20

делаю:
let ws1='cdnnc://c-t6-bintu-stream-eu~nanocosmos~de/atrans.fly20';
let reg=/(\..+)/;
let ws=ws1.search(reg);
alert(ws);


в результате ws имеет значение 50 вместо fly20, хотя выражение проходит проверку на https://regex101.com/

рони 19.12.2018 20:28

Цитата:

Сообщение от bombino1
нужно вырезать

где код?

bombino1 19.12.2018 20:43

немного не понял вопроса, но добавил строку с alert


Часовой пояс GMT +3, время: 22:04.