LINUX.ORG.RU

Подменить граватар

 ,


0

1

Задача: заменить граватар на произвольную картинку. Использую greasemonkey. Содержимое скрипта:

// ==UserScript==
// @name           Подмена граватара
// @namespace      http://www.w3.org/1999/xhtml
// @description    Заменить граватар своей картинкой
// @include        http://godville.net/*
// @include        http://www.gravatar.com/*
// ==/UserScript==

/*
Кусок HTML с картинкой:

<img width="80" height="80" src="http://www.gravatar.com/avatar \
/6661da60460c881c8bd14363b0e6f5d8?rating=PG&amp;size=80" \
alt="6661da60460c881c8bd14363b0e6f5d8?rating=pg&amp;size=80">
*/

annoyingPic = "http://www.gravatar.com/avatar/6661da60460c881c8bd14363b0e6f5d8";

/* Картинка (серый квадрат) */
neutralPic = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5 \
zwKfAAAAAXNSR0IArs4c6QAAAU1QTFRFgICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqK \
i4uLjIyMjY2Njo6Oj4+PkJCQkZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2d \
np6en5+foKCgoaGho6OjpKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsrKy \
s7OztLS0tbW1tra2t7e3uLi4ubm5u7u7vLy8vb29v7+/wMDAwsLCw8PDxMTExcXFxsbGx8fHysrK \
zMzMzc3Nzs7Oz8/P0NDQ09PT1NTU1dXV1tbW19fX2dnZ2tra29vb3Nzc3d3d3t7e39/f4ODg4uLi \
5OTk5ubm5+fn6Ojo6enp6urq6+vr7Ozs7e3t7+/v8PDw8fHx8vLy8/Pz9PT09vb29/f3+Pj4+fn5 \
+vr6/Pz8/f39/v7+////s3ceWwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wGGwsCHxIb \
01wAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHUlEQVRYw+3BgQAAAADD \
oPlT3+AEVQEAAAAAAPAMGVAAAR9aiYoAAAAASUVORK5CYII=";

var images = document.getElementsByTagName("img");
var i = 0;
for (i = 0; i < images.length; i++) {
    if (images[i].src == annoyingPic) {
        images[i].src = neutralPic;
    }
}
ЧЯДНТ?

★★★★
images[i].src = neutralPic;

попробуй заменить на

images[i] = neutralPic;
Хотя, я с чистым JS давно не работал.

jessey
()
Ответ на: комментарий от jessey

С картинками на сайте

images[i].src = neutralPic
прокатывает, проверено. Затык с внешними картинками.

Xenesz ★★★★
() автор топика
Ответ на: комментарий от sdio

Не пролезает URL, даже с локалхоста. ЕМНИМС, зарезано разрабом гризманки спецом «во избежание». Собственно, поэтому base64 в скрипте.

Xenesz ★★★★
() автор топика
Ответ на: комментарий от sdio

Я раньше пытался это делать, брал урлы с интернета и с локалхоста, и напоролся на ограничение гризманки.

Xenesz ★★★★
() автор топика

Сравнивать с annoyingPic надо не на равенство, а как-то так:

images[i].src.indexOf(annoyingPic) == 0

Там же ещё параметры всякие есть.

k_andy ★★★
()
Ответ на: комментарий от Kalashnikov

для лора

Окей, пилю для лора.

// ==UserScript==
// @name           LOR аватары
// @namespace      http://www.w3.org/1999/xhtml
// @description    Заменить аватары на ЛОРе
// @include        http://www.linux.org.ru/*
// @include        http://www.gravatar.com/*
// ==/UserScript==

attila = "http://www.linux.org.ru/photos/48881:-288918317.png";
kernel = "http://www.gravatar.com/avatar/eae2e09a398c2ab0e003ca0093f23a27";
alterAttila = "data:image/png;base64,/* картинка с надписью 'Attila' */";
alterKernel = "data:image/png;base64,/* картинка с надписью 'kernel' */";

var images = document.getElementsByTagName("img");
var i = 0;
for ( i = 0; i < images.length; i++ )
{
    if ( images[i].src == attila )
    {
        images[i].src = altrAttila;
    }
    if ( images[i].src == kernel )
    {
        images[i].src = altrKernel;
    }
}
Такой вариант взлетел наполовину. (Заменилась лоровская ава Аттилы, а граватар Кернела — нет.) В варианте, где вместо for
$('img[src^=attila]').attr('src', altrAttila);
$('img[src^=kernel]').attr('src', altrKernel);
получаем fig. one :(

С document.querySelectorAll не вполне разобрался, но это же для получения списка элементов? Тут как раз проблем нет.

Xenesz ★★★★
() автор топика
Ответ на: комментарий от k_andy

Дай я тебя плюсану в карму! Взлетела гордая птица :)

Xenesz ★★★★
() автор топика
Ответ на: комментарий от Xenesz

Тут как раз проблем нет.

Есть, ты бегаешь по всем картинкам страницы.

[src^=«строка»] означает что аттрибут src начинается с заданной строки. Граватар kernerlа не заменился скорее всего из-за того что в урле есть какие-то дополнительные гет параметры, а ты сравниваешь на точное совпадение с голым.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

в урле есть какие-то дополнительные гет параметры

Есть, я их сначала использовал в сравнении, затем выпилил.

Xenesz ★★★★
() автор топика
Ответ на: комментарий от Xenesz

Ну, вот чтоб с ними не возиться и надо либо src^=, либо substring как предложил k_andy. Селектор по аттрибуту можно сразу запихать в querySelector и избавиться от цикла.

Kalashnikov ★★★
()

Вот так работает:

// ==UserScript==
// @name           LOR avatars
// @namespace      http://www.w3.org/1999/xhtml
// @description    Replace LOR avatars with arbitrary images
// @include        http://www.linux.org.ru/*
// @include        http://fcdn.valka.cz/files/thumbs/*
// ==/UserScript==

kernel = "http://www.gravatar.com/avatar/eae2e09a398c2ab0e003ca0093f23a27";
attila = "http://www.linux.org.ru/photos/48881:-288918317.png";

alterKernel = "data:image/png;base64,/* картинка */";

alterAttila = "http://fcdn.valka.cz/files/thumbs/t_attila_the_hun_152.jpg";
/*
  Используется картинка с внешнего хоста.
  С локалхоста не получается, ни с одним вариантом:
  http://127.0.0.1
  http://localhost
  http://192.168.0.1
*/

var images = document.getElementsByTagName("img");
var i = 0;
for ( i = 0; i < images.length; i++ )
{
    if ( images[i].src.indexOf(kernel) == 0 )
    {
        images[i].src = alterKernel;
    }
    if ( images[i].src.indexOf(attila) == 0 )
    {
        images[i].src = alterAttila;
    }
}

Xenesz ★★★★
() автор топика
Ответ на: комментарий от k_andy

Я понимаю, что всякие открываются. У меня запущен веб-сервер, и картинки из соответствующего каталога открываются в браузере и стягиваются вгетом с адресов http://{127.0.0.1,localhost,$MY_IP,$MY_HOSTNAME}/$PATHNAME.

Xenesz ★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Бросай ты этот фрикад, а то тебя уже тянет на трансанальные тонзиллэктомии :)

Xenesz ★★★★
() автор топика
Ответ на: комментарий от Xenesz

Ну тогда и проблем быть не должно.

Что подразумевается под «не получается»? Картинка старая остаётся или никакой картинки нету?

k_andy ★★★
()
Ответ на: комментарий от k_andy

Дописал в скрипте после

images[i].src = alterKernel;
строку
images[i].alt = "BLABLABLA";
и картинка отобразилась. Это радует. Я быдлокодер с бубном — это не радует :(

Xenesz ★★★★
() автор топика
Ответ на: комментарий от Xenesz

И блин опять не отображается после минорной правки. Вроде всё вернул взад, но вижу только alt, хотя в файрбаге ховер над элементом кажет мою картинку.

Xenesz ★★★★
() автор топика
Ответ на: комментарий от k_andy

опечатка в адресе

Проверено. Не тот случай.

локальный сервер отдаёт не всем реферерам

С пустым реферером (вгету без опций) отдаёт.

Xenesz ★★★★
() автор топика

Нашёл злыдня. Noscript:

# Prevent Internet sites from requesting LAN resources.
Site LOCAL
Accept from LOCAL
Deny

Xenesz ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.