• Накручивание голосований на Друпал.ру

    Простой скрипт на Питоне, накручивающий голосовалки на Друпал.ру:

    import threading
    import urllib
    import re
    import sys
    import time
    import random
    
    try:
        _, nid, variant = sys.argv[:3]
    except:
        print "Usage: python poll.py nid variant"
        exit(1)
    
    
    PROXY_PATTERN = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{2,5}"
    POLL_URL = "http://www.drupal.ru/inner_poll/vote_js"
    
    PROXY_URLS = (
        "http://feeds.feedburner.com/best-proxy/oKhv",
    )
    
    proxies = []
    for url in PROXY_URLS:
        try:
            proxies.extend(re.findall(PROXY_PATTERN, urllib.urlopen(url).read()))
        except:
            continue
    
    params = {
        "n": nid,    # node id
        "v": variant # variant id ("0,1,n" if multiple)
    }
    data = urllib.urlencode(params)
    
    threads = []
    
    print len(proxies), "proxies =)"
    time.sleep(3)
    
    def job(p):
        time.sleep(random.randint(0, 60))
        urllib.urlopen(POLL_URL, data=data, proxies={'http': 'http://' + p})
    
    for p in proxies:
        t = threading.Thread(target=job, args=(p, ))
        try:
            t.start()
        except:
            pass
    

    Запускать так:

    python poll.py nid variant
    

    , где nid — номер ноды, variant — номер варианта ответа (нумерация с нуля) либо варианты через запятую.

    Комментарии к коду.

    1. На Друпал.ру голосование разрешено всем, даже анонимам.
    2. Единственное ограничение на голосование — IP должен быть уникальным в пределах номера ноды.
    3. Запрос осуществляется методом POST с передачей двух переменных: номера ноды и варианта. Про CSRF-токены не, не слышали.
    4. Каждый запрос делаем через свой прокси. Список прокси берем из RSS-ленты сайта http://best-proxy.ru/ Лента, как вы заметили, пропущена через Фидбернер, т.к. создатели сайта огораживаются от граббинга.
    5. Каждый запрос выделяем в свой тред.
    6. КПД проксей где-то 10%, что тоже неплохо.

    Область применения скрипта — накрутка и троллинг.

    Комментарии из старого блога

    03/10/13 RxB: Ну зачем… Теперь все будут знать

    03/10/13 Иван Гришаев: Да и хрен с ним. Во-первых, на Д.ру одни пхп-шники, во-вторых, best-proxy.ru больше не обновляется, прокси из РСС-ленты не работают.

    03/25/13 Александр Мальков: Но, все равно - спасибо. Интересный подход.

  • Работа с Яндекс.Диском из 1С

    1С умеет удивлять. Например, чтобы работать с Яндекс.Диском, не требуется никакого шаманства, все из коробки:

    Путь1 = "https://login:pass@webdav.yandex.ru/path/to/file.txt";
    Путь2 = "c:\file.txt";
    КопироватьФайл(Путь1, Путь2);
    УдалитьФайлы(Путь1);
    КопироватьФайл(Путь2, Путь1);
    

    Данный код копирует файл из облака Яндекса на локальный диск, удаляет из облака и заливает обратно. Вместо login и pass подставляем логин и пароль Яндекса.

    Это дико удобно, потому что, в отличии от Дропбокса, Яндекс поддерживает Вебдав. Диск от Яндекса раскачивается до 10 Гб в полпинка. Таким образом, все прайсы, фотки и прочую статику можно хранить в диске от Яндекса.

    Комментарии из старого блога

    04/17/13 Руслан: Приветствую, ну а что удивительного. Я так понимаю яндекс диск резервирует служебную папку. КопироватьФайл - просто копирует в эту папку файл, а яндекс приблуда висячая в трее, сама синхранизирует данные.

    Пробовали сделать данный не шаманский код, без установленного яндекс диск по?

    04/18/13 Иван Гришаев: Код работает без установленного Я.Диска. В 1С где-то зашита поддержка протокола Вебдав, по которому работает Я.Диск. ФТП тоже поддерживается. В том и прикол, что для работы с файлами из облака устанавливать клиент не нужно.

    04/18/13 Руслан: Ну тогда действительно прикольная штука. Надо по экспериментировать ;)

    08/03/13 Илья: А уверены, что именно 1С поддерживает webDAV а не ОС? Попробуйте под ХР запустить этот код

    08/03/13 Иван Гришаев: Уверен, так написано в доках. А что, под Икс-пи не работает?

    12/23/13 Александр Маляев: Огромное спасибо за наводку! А то никак не мог придумать, куда бы свои 500Гб на Яндексе приспособить. А тут mail.ru еще облако замутило и терабайт в подарок всем дало, и WebDAV скоро обещают - вообще тема будет!

    01/16/14 Иван Гришаев: У мейл.ру подвох в том, что все залитые данные становятся их собственностью, они могут делать с ними все, что хотят. Например, слить бекапы ваших баз конкурентам. Разве что на архив выставлять пароль.

    01/16/14 Александр Маляев: Вы сами понимаете что они это делать не будут. Всего один прецедент, и его так раструбят по всем соцсетям и новостным лентам, что потом не отмоешься. А при миллиардных оборотах так глупо рисковать своей репутацией ради каких-то копеечных архивов? Техподдержка MAIL.RU уже отвечала на этот вопрос, дав понять что этот пункт просто формальность. Конечно все мы понимаем что если спецслужбам понадобятся материалы то любой их предоставит, и MAIL.RU не исключение, но многим ли есть повод скрывать что-то от высокопоставленных органов? Мелкие нарушения в налоговом законодательстве никого не волнуют ни капли. За много лет моей работы сотни архивов баз и паролей ко всему прошли через почту, файлообменники, СМС - и ничего. А уж почта не менее доступна кому надо чем облака.

    01/16/14 Иван Гришаев: Снимите розовые очки. Номера телефонов продают спамерам все. Мейл ру могут слить ваши данные, потому что вы не сможете явно доказать, что слили именно они. Вручную они не буду рыться в ваших данных, скорее, это делает программа, которая ищет во всей этой помойке что-то интересное. Базы от 1С интересны, их можно тайком продавать.

    01/16/14 Александр Маляев: Да, кстати в 1С 7.7 такой поддержки WebDAV нет.

    02/27/14 Виталий: А есть ли возможность из 1С8 получить публичную ссылку на скопированный файл.

    02/27/14 Иван Гришаев: Нет, только средствами Я.Диска.

    03/16/15 Андрей: А куда этот код надо прописать? и как без ПО яндекс.Диска настраивать путь к базе из самой 1с?

    03/16/15 Иван Гришаев: Этот код вы помещаете в любое место, например, в тело формы, модуля. Вторую часть вопроса не понял.

    03/16/15 Андрей: Подскажите можно настроить доступ к яндекс.диску путем https://login:pass@webdav.yandex.ru/path/to/file.txt т.е при выборе пути к БД что указывать? эту строку? как работает такой доступ?

    03/16/15 Иван Гришаев: Андрей, мне кажется, вы не так поняли. БД тут ни при чем. Предположим, что в Я-диске у вас есть папка documents, а в ней файл price.xls. И предположим, что ваш Я-логин andrey, a пароль Super123 Тогда вы можете выкачать файл из Я-диска прямо из кода 1с таким образом

    КопироватьФайл("https://andrey:Super123@webdav.yandex.ru/documents/price.xls", "c:\documents\price.xls");
    

    или наоборот, загрузить файл с локального диска в Я-диск

    КопироватьФайл("c:\documents\price.xls", "https://andrey:Super123@webdav.yandex.ru/documents/price.xls");
    

    Проблема только в том, что в последних билдах 1С стал глючить SSL

    03/16/15 Андрей: А как подключить яндекс диске(с базой 1С) она будет работать? в настройках указать путь к БД 1с какой ? с дисками локальными все понятно а как быть с Яндекс дискам? можно подключить диск командой https://login:pass@webdav.yandex.ru? или нет? просто хочу организовать доступ не локальный(БД не на компе), а скажем через яндекс диск. Это возможно ?

    03/16/15 Иван Гришаев: Андрей, вы можете синхронизировать файл базы через Я-диск только когда не работаете с ней. Когда вы начинаете работу, файл открывается процессом 1С и сторонние процессы не смогут его прочитать. Кроме того, если много клиентов постоянно перезаписывают один и тот же файл, могут возникнуть конфликты, и чья-то сторона вынуждена будет принять не свои данные. Если вам нужна единая база данных, воспользуйтесь хостингами вроде virtual1c.net

    03/16/15 Александр Маляев: Андрей, теоретически это возможно, так как удаленную Webdav-папку можно смонтировать как локальный диск и работать с ней как с обычным диском. Но фактически вы работать не сможете, т.к. скорость будет примерно такая как если бы вы умудрились запустить 1С на каком-нибудь древнем 286-ом.

    Если хотите удаленную а не локальную 1С - то смотрите в сторону “облаков”, в случае этого решения и данные и их обработка происходят на одном удаленном сервере, клиенту “гонится” либо картинка (в случае удаленного рабочего стола), либо небольшие куски данных, отобранные и обработанные сервером (в случае тонкого клиента).

    04/29/15 Алексей: Подскажите пожалуйста, доводилось ли Вам получать с ЯндексДиск штатными средствами 1С 8.3 список файлов в произвольной папке? Без подключения внешних XML библиотек ? Все пишут, что надо сделать запрос (даже без тела), указав только атрибуты (заголовки объекта HTTPЗапрос):

    PROPFIND / HTTP/1.1
    Host: webdav.yandex.ru
    Accept: */*
    Depth: 0
    Authorization: Basic "+ВКодировкеBase64(ЛогинПароль:ИмяФайла)
    

    Но, "PROPFIND / HTTP/1.1 " - это ведь не атрибут, это команда. И как тогда её выполнить штатными средствами 1С?

    04/29/15 Иван Гришаев: Здравствуйте, не приходилось. Нужно смотреть документацию, позволяет ли 1С отправить хттп-запрос методом PROPFIND. Если нет, то увы.

    Проверьте, можно ли передать урл Яндекс-диска в функцию НайтиФайлы() Если тоже нет, установите cURL из запускайте его из 1С как процесс. Текст ответа распарсите силами 1с

    11/20/15 Сергей Лиманчук: Иван, всё прекрасно работало где-то полгода, но с середины вчерашнего дня не копирует никакие файлы, 1С возвращает ошибку “Удаленный узел не прошел проверку”. Любопытно, что мобильное приложение 1С для iOS продолжает работать, ошибка вылезает только на ПК.

    11/20/15 Иван Гришаев: Сергей, да, с какого-то времени схема перестала работать, к сожалению. Вы можете заменить диск от Яндекса на ФТП-сервер. Все то же самое, только в файловом пути пишете ftp:// вместо https://

  • Красота в Питоне: чистка строк

    Есть многострочная (юникодная) строка. Скажем, номера телефонов в столбик.

    Как получить список телефонов безо всякой мишуры вроде пустых строк и лидирующих/конечных пробелов ?

    В Питоне это делается в 3 (три!) строки:

    data = u'''
     23-33-34
       89644616130
    
         79144905640
     266653
    '''
    
    phones = data.splitlines()
    phones = map(unicode.strip, phones)
    phones = filter(bool, phones)
    
    
    print phones
    [u'23-33-34', u'8 964 461 61 30', u'7 9144905640', u'266653']
    

    Вот за что я люблю этот язык.

  • Джанго: тестовый сервер или боевой?

    Вот как определить, в какой среде запущена Джанга:

    # settings.py
    import sys
    DEBUG = "runserver" in sys.argv
    

    Очень удобно — при запуске тестового сервера всегда будет включен дебаг, а в бою — выключен.

  • Дрянь

    Заходим на сайт Сноба. Загрузка подтормаживает. Ставим расширение для Хрома Ghostery. Видим следующее:

    screenshot

    Заблокировано двенадцать(!) источников и почти 30(!) запросов ко всяким счетчикам, виджетам и прочей дряни. Вот полный список (ссылки укорочены многоточиями):

    • http://ads.adfox.ru/165877/prepareCode?p1…
    • http://ads.adfox.ru/165877/prepareCode?p1=bi…
    • http://ads.adfox.ru/159305/prepareCode?p1=b…
    • http://ads.adfox.ru/165877/prepareCode?p1=bisr…
    • http://luxup.ru/tr/8523/&r=http%3A//www.google.com/reader/view…
    • http://ad.adriver.ru/cgi-bin/erle.cgi?sid=110529&sz=reader_index&…
    • http://ad.adriver.ru/cgi-bin/erle.cgi?sid=166191&target=top&bt=21..
    • http://static.chartbeat.com/js/chartbeat.js
    • http://s.clicktale.net/WRc3.js
    • http://connect.facebook.net/ru_RU/all.js
    • https://graph.facebook.com/fql?q=SELECT%20total_count%20FROM%…
    • http://partner.googleadservices.com/gampad/google_service.js?v=276501
    • http://www.googletagservices.com/tag/js/gpt.js
    • http://www.google-analytics.com/ga.js
    • http://www.google-analytics.com/__utm…
    • http://www.google-analytics.com/__utm.gif?utmwv=5….
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&…
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&utms=4…
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&utms=5&utm…
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&utms=6&utmn=42…
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&utms=7&utmn=154032…
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&utms=8&utmn=242…
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&utms=9&…
    • http://www.google-analytics.com/__utm.gif?utmwv=5.3.9&ut…
    • http://www.google-analytics.com/__utm.gif?utmwv…
    • http://counter.rambler.ru/top100.jcn?2327123
    • http://counter.rambler.ru/top100.scn?2327123&rn=880223809…
    • http://www.tns-counter.ru/V13a…
    • http://mc.yandex.ru/metrika/watch.js

    Ладно, аналитику Гугла можно принять. Но зачем счетчики от Яндекса и Рамблера? А теперь подумайте о том, что каждый раз вы грузите себе на комп это говно.

    Нет, установив однажды AdBlock и Ghostery, пользоваться интернетом без них уже не сможешь.

  • Колл-центр, типа

    На рисунке изображена схема будущего колл-центра нашей организации:

    screenshot

    Никогда не мог понять, зачем тратить сотни тысяч на разработку и внедрение подобных схем (плюс затраты на оборудование, поддержку, интеграцию), когда можно увеличить штат телефонистов и отвечать живым голосом.

    Очевидно, что человек звонит, когда информации на сайте, листовках и т.д. уже не достаточно. И заставлять его слушать тарабарщину, давить на кнопки, ждать — нехорошо. В моей практике ни разу не было случая, когда робот-автоответчик помог в решении проблемы.

    Но поскольку у нас Крупная® Организация™, то и схема колл-центра должна быть Корпоративной® и Энтерпрайзной™ — взрывающей мозг, проще говоря. А я устроил маленький саботаж — сделал так, чтобы из любого уровня этого ада можно было соединиться с оператором, нажав «ноль».

    Уверен, это будет самой используемой фичей.

  • Регистрация в Микрософте

    screenshot

    Вот такая скатерть ожидает всякого, кто желает получить регистрационный ключ для Вижуал Студии Экспресс. Несколько пустяковых вопросов:

    • Если продукт бесплатный, зачем трясти с меня какие-то ключи? Вот когда куплю — тогда и буду регистрироваться.
    • «Имя и фамилия» — читаем заблуждения программистов об именах.
    • Зачем дата рождения? Зачем выпадающий список на 31 день? Быстрее вписать руками (я родился 31 декабря и поэтому во всех списках последний). Почему выбор года начинается с 2013? На сайте могут регистрироваться новорожденные? Если нет — зачем засорять список, если да — кому нужна эта дата?
    • Зачем спрашивать пол? Если позарез нужно знать, почему бы не поставить мужской по умолчанию? Политкорректность?
    • Проверка пароля на вхождение зубодробительных элементов. Очень плохой принцип. Хочу 123, значит, пусть будет 123. Все равно учетка на 1 раз.
    • Адская капча в 8 символов. Нормальные люди давно поняли, что боты и китайцы ломают любые капчи, вред от них только пользователю.
    • Спам-галка воткнута по умолчанию.

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

  • Драйверы торгового оборудования

    Есть такая штука — философия Unix. Это свод принципов проектирования систем и программ. Когда вы их придерживаетесь (в т.ч. при разработке под другие системы), то все работает хорошо, а когда отклоняетесь — начинаюстя фейлы.

    Один из принципов состоит в том, что программа делает что-то одно, но очень хорошо. Например, отлично обрабатывает какие-то файлы. Еще один принцип — программа должна быть управляемой другими программами. Например, все данные, вводимые с клавиатуры, можно передать в параметрах командной строки.

    Как следствие из этого — интерфейс программы для связи с внешним миром тоже является отдельной задачей и выносится в дополнительную абстракцию. Так, типичная *nix-программа представляет из себя библиотеку, которая просто делает что-то хорошо. Ее можно подключить в проект и пользоваться зашитыми функциями. Это один из возможных уровней абстракции. Второй — когда пишется команданая утилита. Это просто обертка, которая парсит аргумены командной строки, вызывает функцию библиотеки и выводит результат в stdout. Третий — ГУЙ для конкретной оболочки/среды. Опять обертка, которая пользуется командной утилитой/библиотекой. Четвертый — COM-сервер для Винды. Очередная обертка, сердце программы — библиотека — остается неизменным. Пятый — CGI-скрипт для веб-сервера. Аналогично вышесказанному.

    И так далее. Суть этого подхода в том, что любой желающий сможет прикрутить чужой код к своей системе.

    Но есть уроды-программисты, которые распространяют код в качестве COM-компонент, крутящихся только под Виндой. И плевать, что основная часть кода кроссплатформенна — нет, покупай Винду, ставь антивирус, потому что программер Вася не выучил Си/Плюсы, а сел быдлокодить в Вижуал Бейсике. И все это — в промышленных масштабах.

    Я имею в виду конкретно разработчиков драйверов для торгового оборудования Атол и Штрих-М. Их драйвера — апофеоз идиотизма. Школьнику известно, что устройства, втыкаемые в COM-порт, могут работать в любой операционке, потому что взаимодействие с ними сводится к трем шагам — отправил байты в порт, подождал, прочитал ответ. Все!

    Нормальный программист написал бы библиотеку, отдельно — командную утилиту, потом ГУЙ и т.д. Потом бы подтянулись 1С-ники со своими компонентами, COM-объектами и прочей чушью. И все бы это работало в любой системе.

    Но нет же — качайте их драйвера с COM-объектом. И операционные системы, которые могли бы сделать процесс торговли надежней и безопасней, в пролете. Но мир не без добрых людей — находятся энтузиасты, которые пишут кроссплатформенные драйвера на том же Питоне, например. И работают они хоть на FreeBSD. Спасибо вам за это, ребята.

    Короче, бородатые мужики, заложившие основы IT-систем, знали как надо делать программы. Нужно чаще впоминать их принципы. А если ваша программа работает только в Винде или тупит в ожидании нажатия кнопки — идите в жопу.

  • Привязка пользователей к телефону

    Интернет-гиганты вроде Вконтакта, Одноклассников, Киви и др. давно смекнули, что привязывать учетку лучше не к емейлу, а сотовому. Это правильно. Если ваш сервис хоть немного связан с приватными данными и финансами, требуйте от пользователя сотовый, потому что ему же лучше будет — заполучить физически чужой телефон гораздо труднее, чем взломать виртуальную почту. Плюс телефон есть у всех, в т.ч. у бабушек и детей.

    Специальный абзац для параноиков, уверенных в том, что светить номер — значит, нарываться на спам и лохотронщиков. Во-первых, опсосы и так сливают базы номеров тем, кто хорошо за это платит — помните лотерею на миллион от Биллайна? Во-вторых, спамить через смс дороже и сложнее, значит, отсекаются крупная часть спамеров. В-третьих, в любом нормальном телефоне можно поставить блок на нежелательные номера. В-четвертых, опсосов в последнее время шугают за спам, так что даже устное обращение в колл-центр возымеет действие.

  • 1С и JSON: сериализация ссылок

    Обновил функцию json(): http://pastebin.com/HFaEaETX

    Теперь ссылки справочников и документов преобразуются не в строки вида "Счет №123 от 31.12.2012", а в строку-уникальный идентификатор, например, "f96fbf5f-3ade-11e1-b823-003048643e2d". Зачем это нужно?

    Затем, что разрабатывают конфигурации для 1С в основном криворукие уроды, которые не знают о том, что в каждой таблице должен быть уникальный id, по которому можно однозначно найти элемент таблицы. Это приводит к тому, что коды делают не уникальными или уникальными в пределах владельца. В итоге никакой пользы от кода нет - на кой он нужен, если не уникален? Что делать, если код известен, а владелец нет?

    Специально для борьбы с уродами-разработчиками моя функция любезно вернет вам гуид ссылки, который самый что ни на есть уникальный. А текстовое представление ссылки справочника или документа можно получить в запросе функцией “представлениессылки()”.

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

    Комментарии из старого блога

    07/10/14 Yan: Кстати, разработчики 1С тоже уроды, потому что гуид — это и есть ссылка и ее по идее можно получить в запросе. Почему это до сих пор не реализовано — тайна.

    +100

    07/10/14 Иван Гришаев: Согласен, частенько гуида недоставало.

Страница 84 из 86