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

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

12.07.2012, 15:45. Показов 1345. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru