Наконец-то написал регалку.
Просто кошмар, сколько положено времени на 5,09 кб кода.
К сожалению, GetUrl убирает все проблемы с процессом регистрации, если сайт один, но когда есть два десятка похожих, но всё же разных сайтов, проблемы возникают по новой, из-за того, что один код (не geturl, а мой скрипт) должен обработать кучу разных вариантов. Один\два этапа регистрации, несколько разный набор полей и язык (ладно, это самое простое, тут автоматом), наличие подтверждения по мылу и некоторые другие мелочи, которые я уже не помню. По уму, надо было всё записывать, может программить научился бы когда-нибудь, если б анализировал после. Сейчас смотрю на код, и он выглядит вполне себе простым, однако часа три я грохнул на одну проблемку, которую сам себе создал. О ней и хочу поговорить.
Но для начала — об обвязках. Кто писал обвязку для Curl? Почему-то думается, что многие. Мой первый вариант постепенно разрастался и превратился в чудовище:
function get_curl($host,$cookie=»,$post=»,$header=0,$referer=»,$follow=0,$useproxy=true,$image=false)
Куки, текст пост-запроса, выдавать ли заголовки, реферрер, follow_location, брать ли прокси из глобального массива. А последняя опция вообще замечательная. Все странички у меня распаковывались (т.к. сервакам отдавался заголовок о том, что принимаю gzip), а потом переводились в кодировку windows-1251. Картинки, понятное дело, убивались напрочь. Пришлось ввести очередной параметр.
Понятное дело, смысла в такой функции совсем мало. Легче curl_setopt_array заюзать.
Пришлось переписать. Правда, ещё кучи возможностей не хватает. Заголовки серверам отдаются русские, а надо бы выбор сделать (будет параметр при инициализации обьекта и никакой возможности переопределения. Надо — создавай новый экземпляр), прокси (проверка на наличие $this->proxy и никаких новых параметров), на картинках тоже не тестировал, но это определяется по заголовкам, а никак не параметром функции. Сейчас выходит один опциональный параметр у $this->Get() и два — у $this->Post().
Вообщем, после GetRand, к которому вообще претензий нет и GetUrl, который потребуется позже немного расширить, я взялся за Storage — класс работы с данными. По сути — обвязка к mysql. Написал, всё красиво. Работа выглядит так:
$s=new storage("accounts");
if (!$s->init()) {$s->make("site(50) login(20) pass(20) email(30) url(50)");$s->init();}
$c=new GetUrl();
$c->Get($v);
if(!@$c->parseForm()) die('err form');
$c->formvars['bla']='value';
$c->fillForm($r);
$c->Post();
$s->data['site']='http://'.parse_url($v,PHP_URL_HOST).'/';
$s->data['login']=$c->login;
$s->data['pass']=$c->pass;
$s->data['email']=$c->email;
$s->save();
$s=new storage("accounts");
$s->init();
$s->loadRand(0,10); // с каким статусом (можно false - без учёта статуса) и сколько селектить
while($s->pop()){
// что-то делаем.
$s->changeStatus(1);
}
Возможно имеет смысл перекидывание данных из GetUrl в Storage сделать внутренним, но я не придумал понятный универсальный способ это сделать. Реализовывать поддержку частностей не хотелось бы.
while($s->pop()) для того, что б не делать десять loadRand (то есть, 10 запросов к базе).
А про то, как на самом деле нужно писать правильные обвязки к базам, в следующей серии.