R-dorgen

R-dorgen - генератор статических сайтов.
О всех последних изменениях можно прочитать в readme.
http://r.rushter.com/readme.pdf

Возможности:

  • 5 методов обработки текста.
  • 30 макросов для вставки в html шаблоны.
  • Возможность заливки по ftp протоколу.
  • Генерация “белых страниц”.
  • Парсинг и использование картинок с images.yandex.ru.
  • Xml/html карта сайта .
  • Быстрая скорость генерации (1000 страниц ~15-30 секунд без морфологии,30-100 с морфологией.).
  • Пакетная генерация.
  • Очистка контента от лишних символов.
  • Вставка и парсинг видео с Youtube.
  • Подключение своих модулей для работы с другми сервисами,софтоа
  • Возможность указывать отдельный шаблон для главной
  • Генерация robots.txt
  • Пинг гугла и яндекса(Реализован ввиде плагина)
  • Заливка и распаковка по ftp zip архивов
  • Генерация проектов для Filezilla

Методы обработки текста:

  • Цепи Маркова
  • Синонимизация
  • Синонимизация + смена предложений местами
  • Текст без изменений
  • Смена предложений местами в тексте без изменений.

Методы вставки кейводов:

  • Обычная вставка
  • Соблюдая морфологию
  • Соблюдая морфологию + разбивка кейворда на слова

Структура ссылок:

  • Кейворд.html
  • Кейворд-случайное число.html
  • Подпадка/кейврод.html
  • Часть кейворда
  • Любая своя, составленная из макросов

Имена картинок:

  • Cлучайное слово_случайное число.jpg(foto_999.jpg).
  • sha1 хеш случайного слова(00f2c797fa9fcf1b.jpg).

Читать далее…

Многопоточный чекер проиндексированных страниц Яндекс,Google

Для работы потребуется pycurl и grab.
Поддерживаемые выдачи: Яндекс, Гугл, Гугл за 24 часа, Гугл за неделю, Гугл за месяц.
Яндекс можно чекать без прокси, примерная скорость без прокси при 100 потоках 10 ссылок в секунду.

# coding:utf-8
# author: Rushter
# site: http://rushter.com
from grab import Grab
import re,time,random
import threading,Queue
#################################
useProxy = False
yandexq = True
googlea = False
googled = False
googlew = False
googlem = False
googleMain = False
threads = 100
proxyFile = 'proxy.txt'
proxyType = 'http'
proxyCheckUrl = 'http://google.com'
urls = 'urls.txt'
result = 'result.txt'
separator = '|'
timeout = 150
try_count = 3
##################################
queue = Queue.Queue()
lock = threading.RLock()
proxy = open(proxyFile).readlines()
urlsList = open(urls).readlines()
types = ['','&tbs=qdr:d','&tbs=qdr:w','&tbs=qdr:m']
t1 = time.time()
def getProxy():
    if useProxy:
        proxyType=None
        g = Grab()
        for _ in xrange(try_count):
            proxyq = random.choice(proxy).strip()
            g.setup(proxy=proxyq,
                    proxy_type=proxyType,
                    url=proxyCheckUrl)
            try:
                g.request()
                return proxyq
            except:
                pass
        return None
    else:
        return None
def write(data):
    lock.acquire()
    d = open(result,'a+')
    d.write(data+'\n')
    d.close()
    lock.release()
def worker():
    global queue
    while True:
        try:
            target =  queue.get_nowait()
        except Queue.Empty:
            return 
        check(target)
def check(site):
    result = site+'|'
    if googlea:
        result += google(site,0)+separator
    if googled:
        result += google(site,1)+separator
    if googlew:
        result += google(site,2)+separator
    if googlem:
        result += google(site,3)+separator
    if yandexq:
        result += yandex(site)
    if googleMain:
        if googlea:
            result += google(site,0,True)+separator
        if googled:
            result += google(site,1,True)+separator
        if googlew:
            result += google(site,2,True)+separator
        if googlem:
            result += google(site,3,True)+separator
    write(result)
def google(site,type,main=False):
    g = Grab()
    if useProxy:
        g.setup(proxy=getProxy(),proxy_type=proxyType)
    if main:
        site = site+'/&'
    url='http://www.google.com/search?hl=en&q=site:%s&aq=f&aqi=&aql=&oq=&gs_rfai='%(site)+types[type]
    for _ in xrange(try_count):
        g.setup(url=url,timeout=timeout)
        g.request()
        data = g.response_body
        if data.find('did not match any')>0:
            count=list('0')
        else:
            count = re.findall('resultStats.*?([0-9,]{1,10}).*?nobr',data)
        if len(count)!=0:
            count = count[0].replace(',','')
            return count
    return 'err'
def yandex(site):
    g = Grab()
    if useProxy:
        g.setup(proxy=getProxy(),proxy_type=proxyType)
    url = 'http://search.qip.ru/search?query=site:%s&lr=1'%(site)
    for _ in xrange(try_count):
        g.setup(url=url,timeout=timeout)
        g.request()
        data = g.response_body
        count = re.findall('найден.{0,2}<br /> (.*?) страниц',data)
        if len(count)!=0:
            count = count[0].replace('миллион','000000').replace('тысяч','000')
            return count
    return 'err'
def main():
    d = open(result,'w')
    d.write('Site'+separator)
    if googlea:
        d.write('Google '+separator)
    if googled:
        d.write('Google day '+separator)
    if googlew:
        d.write('Google week '+separator)
    if googlem:
        d.write('Google month '+separator)
    if yandexq:
        d.write('Yandex '+separator)
    if googleMain:
        if googlea:
            d.write('MGoogle '+separator)
        if googled:
            d.write('MGoogle day '+separator)
        if googlew:
            d.write('MGoogle week '+separator)
        if googlem:
            d.write('MGoogle month '+separator)
    d.write('\n')
    d.close()
    print "Check started"
    for u in urlsList:
        queue.put(u.strip())
    for _ in xrange(threads):
        thread_ = threading.Thread(target=worker)
        thread_.start()
    while threading.active_count() >1:
        time.sleep(1)
        print queue.qsize()
    print "Check ended"
    print str(time.time()-t1)
main()

Скрещиваем A-poster и R-dorgen

Многие те, кто используют a-poster, наверняка знают о возможности использования своих функций. В данном примере я рассмотрю использование функции, которую предоставляет сам автор и передачу ей данных с помощью плагина для R-dorgen. Так как функция берет файлы со ссылками прямо из своей папки, то приходится заливать эти файлы туда. Конечно, эту функцию для удобства можно переписать, но я этого делать не стал. Для этого я написал простой php обработчик, который заливает файлы в папку с функцией. Описание параметров задания и саму функцию можно взять у автора на форуме, после покупки.
Плагин для R-dorgen:

class aposter(object):
    def run(self,domain,keywords,keyurl,pages):
        from grab import Grab
        g = Grab()
        # Заливка файла со ссылками на сервер с a-poster
        data = open("data/lnk/{0}.txt".format(domain)).read().decode("utf-8")
        g.setup(url='http://domain.ru/upl.php',
                post={'name':domain+'.txt','data':data,'pw':'xek'   },
        timeout=150
                )
        g.request()
        # Передача задания для a-poster
        g.setup(url='http://domain.ru/a-poster/external.pl',
                payload="""<password></password> 
<base>useit.txt</base> 
<tasktype>spam</tasktype> 
<spamtype>myfunc</spamtype> 
<myfuncbulk>1</myfuncbulk> 
<myfuncfile>func.pl</myfuncfile> 
<checkpost>0</checkpost> 
<checkpostminpr>0</checkpostminpr> 
<checkpostmaxlinks>0</checkpostmaxlinks> 
<saveparsed>0</saveparsed> 
<readonlyheader>1</readonlyheader> 
<savegood>0</savegood> 
<saveforcheck>0</saveforcheck> 
<proxy>noproxy</proxy> 
<log>no</log> 
<start>0</start> 
<end>0</end>  
<name>TestName</name>  
<mail></mail>  
<url></url>  
<comment>{0}.txt;3;4</comment> 
<quantification>1</quantification>""".format(domain))
        g.request()
        # Вывод результата
        print g.response_body

PHP заливщик файлов(upl.php):

< ?php
if ($_POST['pw']=='xek') {
$data = $_POST['data'];
$name = $_POST['name'];
$fp = fopen("a-poster/my_functions/{$name}",'w');
fwrite($fp,$data);
fclose($fp);
}
?>

Всё что требуется потом: залить php обработчик,правильно указать настройки задания для a-poster и закинуть плагин в папку с доргеном.
В результате весь процесс получается автоматизированным, ручной работы почти нет, кроме добавления заданий в пакетку доргена :)

Сканер портов

Давно ничего не писал, совсем разленился, да и писать не о чём. Зашёл тут недавно глупый спор о скорости работы сокетов на perl и python, пришлось написать простой многопоточный скриптик. Пригодится может кому, для изучения python. В результате мой метод оказался хитрее и быстрей :)

# coding:utf-8
# author: Rushter
# site: http://rushter.com
import socket,Queue,threading
from time import time
queue = Queue.Queue()
HOST = "localhost"  
COUNT = 1000
THREADS=100
TIMEOUT = 0.01
def worker():
    global queue
    while True:
        try:
            target =  queue.get_nowait()
        except Queue.Empty:
            return 
        check(target)
 
def check(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(TIMEOUT)    
    try:
        sock.connect((HOST, port))
    except:
        return
    print port
    sock.close()
def main():
    t1 = time()
    for i in xrange(COUNT):
        queue.put(i)
    for _ in xrange(THREADS):
        thread_ = threading.Thread(target=worker)
        thread_.start()
    while threading.active_count() >1:
        pass
    t2 = time()
    print t2-t1
main()

Парсер google через ajax search api

Простейший парсер google через api. Кому надо, тот сам доведёт до ума, с меня только идея :) . Позволяет парсить примерно 60к ссылок без бана и капчи с 1 Ip, для большей работоспособности без бана можно попробовать добавить задержку.
Все файлы должны быть в utf-8.

# coding:utf-8
# author: Rushter
# site: http://rushter.com
import urllib2,random,re,time,json,urllib
ff = open("ua.txt").readlines()
ques = open("query.txt").readlines()
out = open("parsed_query.txt","a")
err = 0
for query in ques:
    try:
        for j in range(0,12,4):
            header = {"User-Agent":random.choice(ff)}
            lnk = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&start={0}&q={1}".format(str(j),urllib.quote(query.strip("\r\n")))
            page_request = urllib2.Request(url=lnk, headers=header)
            page = urllib2.urlopen(url=page_request)
            pp = json.load(page)["responseData"]["results"]
            try:
                for i in xrange(4):
                    out.write(pp[i]["unescapedUrl"]+"\n")
                out.flush()
            except:
                if err>100:
                    break
    except:
        if err>100:
            break
        err = err+1

Простейший многопоточный чекер ftp

Простейший чекер, ftp акки кидать в ftp.txt вида ftp.narod.ru:21|user|password.Порт указывать обязательно.В начале скрипта можно установить количество потоков,разделитель и таймаут.Если при подключении к ftp возникает ошибка, то аккаунт попадает в bad.txt, иначе в good.Ошибками может служить:таймаут подключения,неправильный логин и т.д.

# coding:utf-8
# author: Rushter
# site: http://rushter.com
from ftplib import FTP
import Queue
import threading
import urllib
import time
queue = Queue.Queue()
lock = threading.RLock()
threads_count = 10
separator = "|"
timeout = 3
def worker():
    global queue
    while True:
        try:
            target =  queue.get_nowait()
        except Queue.Empty:
            return 
        check(target)
def write(data,s):
    lock.acquire()
    if s:
        put = open("good.txt","a")
    elif not s:
        put = open("bad.txt","a")
    put.write(data+"\n")
    put.close()
    lock.release()
def check(qq):
    qq = qq.strip("\r\n").split(separator)
    host = qq[0]
    host,port = urllib.splitport(host)
    ftp = FTP()
    try:
        ftp.connect(host, port, timeout)
        ftp.login(qq[1],qq[2])
        write("|".join(qq),True)
        ftp.close()
    except:
        write("|".join(qq),False)
def main():
    print "Check started"
    file = open("ftp.txt").readlines()
    for f in file:
        queue.put(f)
    for _ in xrange(threads_count):
        thread_ = threading.Thread(target=worker)
        thread_.start()
        while threading.active_count() >1:
            time.sleep(1)
    print "DONE"
main()

Jquery + Ajax = Redirect

Написал для себя относительно безпалевный редирект с использованием jquery.Всё очень просто,в redir.html правим ссылку на платник.
На странице где хотим поставить редирект подключаем js фаилы и кнопку по которой будет осуществляться редирект.

<script src="http://code.jquery.com/jquery-1.4a2.min.js"></script>
<script type="text/javascript" src ="js.js"></script>      
<a href="#" id="rdr"><img src="banner.jpg" /></a>

Если не хотите чтобы кнопка была ввиде ссылки,то можно сделать так:

<img id="rdr" src="banner.jpg" style="cursor:hand" />

js.js:

            jQuery(document).ready(function(){
                jQuery('#rdr').click(function(){
                   jQuery(this).load('redir.html',function(resp) {
				   eval(resp);
				})
                }) 
            });

redir.html:

window.location = 'http://rushter.com/';

За идею спасибо DoorMan,у него это было реализовано без Jquery.
Cкачать:Jquery redirect

R-dorgen 2.2

Обновился R-dorgen.Новую версию можно будет купить уже через 2 дня.
http://dm.rushter.com
Указать на баги и написать пожелания можно в комментариях.
Что нового:

  • Вставка и парсинг видео с Youtube
  • Морфология и разбивка на части кейвордов(отнимает больше времени при генерации).
  • Добавлены 2 новые структуры ссылок,2 типа имен картинок.
  • Добавлены 3 типа вставки кейвордов(Обычный,соблюдая морфологию,собдюдая морфологию + разбивка на слова).
  • Добавлены новые макросы позволяющие более универсальней работать с текстом.
  • Исправлены баги заявленные первыми покупателями.

Документация скоро обновится,цена поднялась до $100.