Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 11.06.2012
Сообщений: 40

Загрузка изображений через Indy + немного оптимизации

12.07.2012, 15:45. Показов 1366. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я разобрался как используя Indy авторизовываться на файлообменниках Теперь мне интересно как можно используя инди залить изображение на обменник изображений. Например пусть будет http://www.imagebam.com/basic-upload

При загрузке через браузер я наблюдаю сниффером значение Content-Length, которое значительно (на ~5000) больше размера файла (ftell'ом определил), и всегда варьируется в зависимости от файла.
В самом запросе передаётся внутренний код изображения (я не знаю как это можно объяснить ещё) вместе с запросом. Вроде бы это не сложно, но как же можно из этого составить запрос? Можно ли открыть файл в режиме чтения, запихнуть содержимое изображения в строку и объединить со строкой POST запроса, чтобы потом отправить? Показания сниффера присоединяю к этому сообщению


Теперь по поводу оптимизации.. Как я сказал раньше я написал функцию для авторизации на сайте, сохранения куков и выкачивания ссылок на скачивание файлов.. Однако у меня эта функция имеет вид как у блондинки первокурсницы, начавшей изучать паскаль =) Помогите оптимизировать)) Как пользоваться TStringList я не знаю толком Написал её с использованием Memo

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
void __fastcall ParseLink(void){
//GET FILE LINKS
AnsiString ornset =(ExtractFileDir(Application->ExeName) + "\\HostingUpload.ini"); //Файл с настройками логина и пароля
TIniFile *Orn;  //ини файл
Orn = new TIniFile(ornset);  
AnsiString loginR=Orn->ReadString("RG","login"," ");   //значения логина и пароля считываем из файла
AnsiString passwordR=Orn->ReadString("RG","password"," "); //хотя они есть на форме9 едит1 и едит2
Form1->IdHTTP1->Request->Host="www.rapidgator.net";  //обычные настройки инди
Form1->IdHTTP1->Request->ContentLength=72;   //известно, что длина должна быть точной, почему я не знаю
Form1->IdHTTP1->Request->CacheControl="max-age=0"; 
Form1->IdHTTP1->Request->UserAgent="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.15 Safari/537.1";  //взял из сниффера
Form1->IdHTTP1->Request->ContentType="application/x-www-form-urlencoded";
Form1->IdHTTP1->Request->Accept="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
Form1->IdHTTP1->Request->Referer="http://www.rapidgator.net/auth/login"; //страница авторизации
Form1->IdHTTP1->Request->AcceptEncoding="gzip,deflate,sdch";
Form1->IdHTTP1->Request->AcceptLanguage="ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4";
Form1->IdHTTP1->Request->AcceptEncoding="windows-1251,utf-8;q=0.7,*;q=0.3";
Form1->IdHTTP1->CookieManager=Form1->IdCookieManager1;  //может и без него заработает, т.к. я вручную сделал куки
Form1->IdHTTP1->HandleRedirects=true;   
AnsiString site="http://www.rapidgator.net/auth/login";   //ссылка для авторизации
AnsiString request="LoginForm%5Bemail%5D="+loginR+"&LoginForm%5Bpassword%5D="+passwordR; //сам пост запрос
Form1->Memo7->Clear(); //очищаю Memo7 которое в качестве TStringList'а использую
Form1->Memo7->Lines->Add(request);  //добавляю этот самый запрос
AnsiString resp;  //строка ответ
Form1->IdHTTP1->Post(site,Form1->Memo7->Lines);  //отправил таким образом POST запрос
Form1->Memo7->Clear();  //и убрал за собой, т.к. авторизовался на сайте, исходный код страницы не нужен пока
 
resp=Form1->IdHTTP1->Response->RawHeaders->Text;
Form1->Memo7->Lines->Add(resp);
Form1->Memo7->Clear();  //честно говоря не знаю зачем я это сделал (последние 3 строчки), но всё работает, боюсь трогать.
Form1->IdHTTP1->Response->RawHeaders->Extract("Set-Cookie", Form1->Memo7->Lines);  //достаю куки
Form1->IdHTTP1->Request->CustomHeaders->Text="Cookie:"+Form1->Memo7->Lines->Strings[0]; //хотя там две строки, но я беру первую
resp=Form1->IdHTTP1->Get("http://www.rapidgator.net/filesystem/index");  //открываю страницу с использованием куков, успех
Form1->Memo7->Clear(); //убераю за собой на всякий случай
Form1->Memo7->Lines->Add(resp);  //добавляю исходник (он в виде строки обычной)
Form1->Memo7->Lines->SaveToFile("luck.html"); //сохраняю в файл
Form1->Memo7->Clear(); //очищаю
//Сложное извлечение и формирование ссылок
Form1->Memo1->Lines->LoadFromFile("luck.html");
/*опять загружаю (тут вот проблема конкретная, но работает) Если не сохранять и не загружать то нижеисполненный алгоритм не будет работать, а по какой причине - я не знаю. Хотя количество строк 955, но неужели ни в одной строке нету искомого?*/
AnsiString query;
int m=0;                 //270
int n;
int vl=0;
 
bool fastadd=true;
bool unique;
if (Linkadder->Memo1->Lines->Count!=0) {
  fastadd=false;
}
while (m<Form1->Memo1->Lines->Count){       
 
query=Form1->Memo1->Lines->Strings[m];    //Всё что мне тут надо поменять это чтобы использовался TStringList
 
n=query.Pos("<td style=\"display:none\">id&gt;");
if (n!=0) {
 
 
if (strlen(query.c_str())>10)
query.Delete(1,n+strlen("<td style=\"display:none\">id&gt;")-1);
query="[url=http://www.rapidgator.net/file/"+query;
if (strlen(query.c_str())>10)
n=query.Pos(",level&gt;0,key_left&gt;0,key_right&gt;0,name&gt;");
query.Insert("]",n);
query.Delete(n+1,strlen(",level&gt;0,key_left&gt;0,key_right&gt;0,name&gt;"));
n=query.Pos(",type&gt;");
query.Delete(n,query.Length()-n);
query.Delete(query.Length(),1);
query=query+"[/url]";
unique=true;
if (fastadd==false) {
 //Проверка на уникальность
 for (vl=0; vl < Linkadder->Memo1->Lines->Count; vl++) {
 
  if (strcmp(query.c_str(),Linkadder->Memo1->Lines->Strings[vl].c_str())==0)
  unique=false;
 
}
if (unique==true) Linkadder->Memo1->Lines->Add(query);
 }
else  Linkadder->Memo1->Lines->Add(query);
 
}
m++;
}
Form1->Memo1->Clear();
}
Писал я это методом тыка..) проверял как получаются куки, а как нет. Оказывается что без www. они не получаются) не знаю почему. Вот.. Надеюсь на то, что вы поможете советом хотя бы =)
Миниатюры
Загрузка изображений через Indy + немного оптимизации   Загрузка изображений через Indy + немного оптимизации  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2012, 15:45
Ответы с готовыми решениями:

Indy загрузка изображения
Здравствуйте. Возникла проблема: есть ссылки, по которым должны быть изображения, но вместо них там html код. Пример:...

Загрузка файла на сервер через POST (немного подправить html)
Вот в этом исходнике при выборе файла выскакивает диалог и спрашивает какой файл выбрать. Как переделать так чтобы было текстовое поле и...

Загрузка изображений через форму
Добрый день, есть input для загрузки нескольких картинок на сервер &lt;input name=&quot;userImage&quot; type=&quot;file&quot;...

8
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.07.2012, 19:09
1. Почему везде идет обращение через Form1 ? Не лече вместо ф-ции использовать метод формы?
2. Почему не обрабатываются исключения Indy?
3. Почему создается обьект TIniFile, но не удаляется?
4. Почему столько много коментарий в "очевидных" местах и нет коментов например к этому:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//....
if (strlen(query.c_str())>10)
query.Delete(1,n+strlen("<td style=\"display:none\">id&gt;")-1);
query="[url=http://www.rapidgator.net/file/"+query;
if (strlen(query.c_str())>10)
n=query.Pos(",level&gt;0,key_left&gt;0,key_right&gt;0,name&gt;");
query.Insert("]",n);
query.Delete(n+1,strlen(",level&gt;0,key_left&gt;0,key_right&gt;0,name&gt;"));
n=query.Pos(",type&gt;");
query.Delete(n,query.Length()-n);
query.Delete(query.Length(),1);
query=query+"[/url]";
//....
0
0 / 0 / 1
Регистрация: 11.06.2012
Сообщений: 40
12.07.2012, 19:42  [ТС]
1. Потому как я эту функцию в саму форму запихнул, и при её вызове компилятор не определяет к чему относятся Memo1, Memo7 и т.д.
2. Не знаю как.
3. А разве это надо? Если да то как?
4. Это собственно то, что моя программа должна делать, а именно разбирать строку кода и удалять не нужные фрагменты, преобразовывая ссылку в BB-Код вида [ url = ссылка ] имя файла .ext [ /url ]
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.07.2012, 19:50
1. Вот именно почему имено в ф-цию, а не метод формы? тогда бы не нужен был Form1->...
2. Приблизительно так ( писал с головы)
C++
1
2
3
4
5
6
try{ IdHTTP1->Post(site,Form1->Memo7->Lines); }
catch(EIdException &E) 
 {
   ShowMessage(E.Message);
   return 0;
 }
3. Ну да как и для всех динамически созданных объектов в С++
C++
1
2
3
4
TIniFile *Orn;  //ини файл
Orn = new TIniFile(ornset);  
//..
delete Orn;
4. Как я понял парсит, то есть это легче было бы сделать с помощью регулярного выражения или специального парсера.
1
0 / 0 / 1
Регистрация: 11.06.2012
Сообщений: 40
12.07.2012, 20:03  [ТС]
1. Не изучал ещё объектно ориентированное программирование. Не особо разбираюсь что есть что.. Я лишь закончил первый курс
2. Благодарю, попробую.
3. Благодарю.
4. Нет, не проще, т.к. ссылки значительно отличаются. К примеру на OR строка с ссылкой имеет такой вид:
HTML5
1
    <td align="left"><a href="http://oron.com/sdgdfg">we1235wt.ext</a></td>
А на RG такой:
HTML5
1
<tr class="odd"><td style="display:none">id&gt;18908321346,level&gt;0,key_left&gt;0,key_right&gt;0,name&gt;file.txt,type&gt;Файл txt,size&gt;128 B,hash&gt;5f3dd74682a9499a69c9e46b72436030</td><td style="width:15px;"><input type="checkbox" class="select-checkbox" id="checkbox_18908346"/></td><td><img src='/images/filemanager/file_small.png' alt=''> Post_rapidgator.txt</td><td>Файл txt</td><td class="td-for-select">128 B</td><td style="width: 80px;">18-06-12 10:11</td><td style="width: 80px;">-</td><td style="width: 50px;">0</td></tr>
Поэтому для каждого сайта разный отбор ссылок.
Моя программа не только парсер
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.07.2012, 21:26
4.
т.к. ссылки значительно отличаются.
Поэтому для каждого сайта разный отбор ссылок.
Тем более... не будеш же ты каждый раз код менять?

А регуляркой достаточно задавать её допутим в самой программе через Edit. ( А лучше ComboBox и подгружать с файла )
0
0 / 0 / 1
Регистрация: 11.06.2012
Сообщений: 40
12.07.2012, 22:25  [ТС]
Знал бы ещё как подключить эти регулярные выражения..)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2012, 18:51
Читай про boost/regex.
0
0 / 0 / 1
Регистрация: 11.06.2012
Сообщений: 40
13.07.2012, 19:22  [ТС]
Хорошо, почитаю.
А как сделать загрузку изображений на хостинг??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2012, 19:22
Помогаю со студенческими работами здесь

Загрузка в базу mysql изображений через форму
Доброго всем утра! Я начинающий программист, пробую разобраться с задачей: есть база данных MySQL, в ней создана таблица (всего 2 поля: id...

Немного оптимизации
Можно ли из двух таких слотов сделать один? void Thread::getA(float a) { data-&gt;A = a; emit sendA(a); } void...

Загрузка изображений на страницу без использования HTML! Как это реализовать? Через что, подскажите?
&lt;div class=&quot;pikachoose&quot;&gt; &lt;ul id=&quot;pikame&quot; &gt; &lt;li&gt;&lt;a href=&quot;images/banner1.jpg&quot;&gt;&lt;img...

Посоветуйте хороший плагин оптимизации изображений
Привет! Посоветуйте, плиз, хороший оптимизатор изображений для Wordpress, чтобы не скачивать папки с картинками, а оптимизировать прямо из...

Загрузка куков Synapse или Indy
Ребят, помогите такая проблема. Не могу авторизоваться на сайте из-за того что не хватает куков для авторизации. Как их получить ? Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru