ホームページ  >  記事  >  バックエンド開発  >  Curl を使用してページにデータを投稿すると、確認コード エラーが表示されます。助けてください。

Curl を使用してページにデータを投稿すると、確認コード エラーが表示されます。助けてください。

WBOY
WBOYオリジナル
2016-06-23 14:12:241041ブラウズ

ターゲット サイト: http://218.25.58.44/searchsys/



私のソース コードは次のとおりです:



さて問題は、返される結果は「検証コード エラー」、つまり検証コードです。無効です。アドバイスをお願いします!
CSDNで関連情報を確認しましたが、まだわかりません。 Cookieを使用して投稿する必要があると書かれていました。このプロセスについてはよくわかりません。取得した確認コードが Cookie と一致していることを確認するにはどうすればよいですか?現在、認証コードの認識問題は無事解決しました。
専門家のご指導ありがとうございます!


ディスカッションへの返信 (解決策)

パケット キャプチャ ツールを使用して、発生したすべてのデータ送信を分析します。その後、送信されたデータが一貫していることを確認します。詳細については、curl の関連パラメータを参照してください

確認コード画像を取得する場合は、少なくとも

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); が必要です。 cookiefile: Cookie を保存するファイル名


対象のページにデータを送信するとき、Cookie を持ってくる必要があります
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); 問題は、検証コードをどのように確認するかです。有効期限はありませんか?言い換えれば、curl get を使用して http://218.25.58.44/searchsys/ ページへのアクセスをシミュレートするときに、検証コードを保存するにはどうすればよいでしょうか?データにアクセスした後、検証コードがローカルにキャッシュされますが、それは可能ですか?

少なくとも検証コード画像を取得する際には、
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); が必要です
$cookiefile: Cookie を保存するファイル名

対象のページにデータを送信する際には、次のものが必要ですCookie を運ぶため

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); では、検証コードはどうなるでしょうか?クッキーを持って行っても、認証コード認識機能を呼び出すと認証コードが再生成されてしまいました!検証コードを生成するファイル (img.jsp) へのアクセスをシミュレートする必要があるでしょうか?これはあまり明確ではないので、アドバイスをお願いします

認証コード画像を取得するときに同時に Cookie を取得する必要があることはすでに述べました
認証コードはセッションに保存され、セッション ID はCookie

送信時には絶対に行わないでください Cookie をもう一度読み取ってください。読み取った後、セッション ID が変更される可能性があり、以前に読み取った Cookie を送り返す必要があります


ロジックは図に示すとおりです。ご理解いただけると幸いです。

認証コードの画像を取得していることはすでに述べましたが、同時に Cookie も取得する必要があります
認証コードはセッションに保存され、セッション ID は Cookie に配置されるため

Cookie を読み取ってはいけません送信時にもう一度読み込むと、セッション ID が変更される可能性があります
以前に読み取られた Cookie は返送する必要があります

問題は、それを同時に行う方法です。 「認証コード画像を取得する際にCookieを取得する必要があります。」 ありがとうございます。どうもありがとうございます。


認証コード画像を取得するときに同時に Cookie を取得する必要があることはすでに述べました

認証コードはセッションに保存され、セッション ID は Cookie に配置されるため

送信時に Cookie を決して読まないでくださいセッション ID を変更することは可能です
が、以前に読み取られた Cookie を送信する必要があります
問題は、それを同時に行う方法です。 「認証コード画像を取得する際にCookieを取得する必要があります。」 ありがとうございます。どうもありがとうございます。
私もあなたと同じ問題に遭遇しました。検証コード認識機能は、検証コードによって生成されたアドレスを毎回再度読み取るため、送信に一貫性がありません。ページがロードされた後、検証コードを保存してみてください。一時ファイルを呼び出し元の一時フォルダーにクリップし、送信する前に確認コードを特定してください

8 階に感謝しますが、詳しく説明してもらえますか?ページインターセプト後の検証コード、つまり一時フォルダーに保存された検証コードを取得するためにどのステートメントを使用すればよいかわかりません。PHP ステートメントを使用してこれを実装するにはどうすればよいですか?ありがとうございます

たとえば、次のコードを使用してページにアクセスします

$ch = curl_init("http://218.25.58.44/searchsys/") ;  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回  curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回  $output = curl_exec($ch) ; echo $output;curl_close($ch);


例:
$cookiefile = realpath('123.txt')
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); Output =curl_exec ($ch)、取得した Cookie はファイル 123.txt に保存されます

後で、curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); によって Cookie を転送できます

これ以上言えなかったと思います明らかに


モデレータはコメントに Q を追加できますか?あなたが言ったことはまだ理解できませんが、それは私の問題ではありません。私の質問: 9174059 追加していただければ幸いです、モデレーターに感謝します。

比如:
$cookiefile = realpath('123.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
$output = curl_exec($ch) 后,文件 123.txt 中保存有取回的 cookie
以后再 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); 就可以将 cookie 传回去了

我想我说的再清楚不过了
按你说的做了,在没有带cookie时,提示“验证码已失效”,按你说的加上cookie后,提示变了“验证码错误”,我感觉还是我取到的验证码没能同步,就是我取到的码是“重新生成”的码。求解!

贴出你的代码,不要截图!(可删节,但通讯部分必须完整)

贴出你的代码,不要截图!(可删节,但通讯部分必须完整)
代码如下:

get_by_curl("http://218.25.58.44/searchsys/");//得到cookiegetGJWZResult('小型汽车','辽AQ007B','4300');//查询违章结果function get_yzm(){    $valite = new valite();    $valite->setImage("http://218.25.58.44/searchsys/img.jsp");    $valite->getHec();    $valite->filterInfo();    $valite->dealwithData();    $data = $valite->run();    $data = implode("",$data);    return $data;}function getGJWZResult($car_type = '',$car_no = '',$car_checkcode = '',$x='',$y='') {    header("Content-type:text/html;charset=utf-8");    $remote_server = 'http://218.25.58.44/search/wzcxrs.action';    $post_string = 'wzcx.autotype='.$car_type.'&wzcx.autono='.$car_no.'&wzcx.memo='.$car_checkcode.'&rand='. get_yzm().'$x='.$x.'$y='.$y;    $output = post_by_curl($remote_server, $post_string);    echo $output;    //return trim(getcontentbetween('<td align="center"  ><font size="5">','</font>',$output));}function get_by_curl($remote_server){    $cookiefile = realpath('cookie.txt');    $ch = curl_init($remote_server);     curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);//存储cookies    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);    curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);    $data = curl_exec($ch);    curl_close($ch);    //return $data;}function post_by_curl($remote_server, $post_string) {    $cookiefile = realpath('cookie.txt');	$ch = curl_init();	curl_setopt($ch, CURLOPT_HEADER, 0);	curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies    curl_setopt($ch, CURLOPT_URL, $remote_server);    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $data = curl_exec($ch);    curl_close($ch);    return $data;}

你在 get_yzm() 函数中获取了 cookie 吗?(从代码中看不出来)

通常验证码值是在验证码图片生成时写入 session 的,如果你不能取得此时的 sessionid,那么验证是不会成功的 

简单的说,至少在取图片的时候就要保存一次cookie(页面的cookie反而不重要)
提交时再把这个cookie发回去(一并提交)

就是说 http://218.25.58.44/searchsys/img.jsp 的cookie要得到

看了一下连接:
1、查询页面 http://218.25.58.44/searchsys/ 已设置了 sessionid (Set-Cookie: ....; Path=/)
所以你需要先访问此 url,并获取 cookie
2、验证码图片 http://218.25.58.44/searchsys/img.jsp
从这个 url 获取图片流时,需将第1步读取的 cookie 发过去,不然将因为没有收到 sessionid 而产生新的 sessionid
3、表单处理 http://218.25.58.44/searchsys/search/wzcxrs.action
向此 url 发送数据时,一定要将第1步读取的 cookie 一并发过去

看了一下连接:
1、查询页面 http://218.25.58.44/searchsys/ 已设置了 sessionid (Set-Cookie: ....; Path=/)
所以你需要先访问此 url,并获取 cookie
2、验证码图片 http://218.25.58.44/searchsys/img.jsp
从这个 url 获取图片流时,需将第1步读取的 cookie 发过去,不然将因为没有收到 sessionid 而产生新的 sessionid
3、表单处理 http://218.25.58.44/searchsys/search/wzcxrs.action
向此 url 发送数据时,一定要将第1步读取的 cookie 一并发过去
按您说的改了代码,可是还是提示验证码错误!

get_by_curl("http://218.25.58.44/searchsys/");//得到cookieecho $yzm = get_yzm(get_yzm_with_cookie("http://218.25.58.44/searchsys/img.jsp"));getGJWZResult('小型汽车','辽AQ007B','4300',$yzm);//查询违章结果function get_yzm_with_cookie($remote_server){    $cookiefile = realpath('cookie.txt');    $ch = curl_init();    curl_setopt($ch, CURLOPT_HEADER, 0);    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies    curl_setopt($ch, CURLOPT_URL, $remote_server);    //curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $data = curl_exec($ch);    curl_close($ch);    return $data;}function get_yzm(){    $valite = new valite();    $valite->setImage("http://218.25.58.44/searchsys/img.jsp");    $valite->getHec();    $valite->filterInfo();    $valite->dealwithData();    $data = $valite->run();    $data = implode("",$data);    return $data;}function getGJWZResult($car_type = '',$car_no = '',$car_checkcode = '',$yzm='') {    header("Content-type:text/html;charset=utf-8");    $remote_server = 'http://218.25.58.44/search/wzcxrs.action';    $post_string = 'wzcx.autotype='.$car_type.'&wzcx.autono='.$car_no.'&wzcx.memo='.$car_checkcode.'&rand='. $yzm;    $output = post_by_curl($remote_server, $post_string);    echo $output;    //return trim(getcontentbetween('<td align="center"  ><font size="5">','</font>',$output));}function get_by_curl($remote_server){    $cookiefile = realpath('cookie.txt');    $ch = curl_init($remote_server);     curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);//存储cookies    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);    curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);    $data = curl_exec($ch);    curl_close($ch);    //return $data;}

代码粘错了,我是这样改的,但出现了N多错误。主要是验证码图片那块语句不知道怎么写了。

get_by_curl("http://218.25.58.44/searchsys/");//得到cookieecho $yzm = get_yzm(get_yzm_with_cookie("http://218.25.58.44/searchsys/img.jsp"));getGJWZResult('小型汽车','辽AQ007B','4300',$yzm);//查询违章结果function get_yzm_with_cookie($remote_server){    $cookiefile = realpath('cookie.txt');    $ch = curl_init();    curl_setopt($ch, CURLOPT_HEADER, 0);    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies    curl_setopt($ch, CURLOPT_URL, $remote_server);    //curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $data = curl_exec($ch);    curl_close($ch);    return $data;}function get_yzm($yzm){    $valite = new valite();    $valite->setImage($yzm);    $valite->getHec();    $valite->filterInfo();    $valite->dealwithData();    $data = $valite->run();    $data = implode("",$data);    return $data;}function getGJWZResult($car_type = '',$car_no = '',$car_checkcode = '',$yzm='') {    header("Content-type:text/html;charset=utf-8");    $remote_server = 'http://218.25.58.44/search/wzcxrs.action';    $post_string = 'wzcx.autotype='.$car_type.'&wzcx.autono='.$car_no.'&wzcx.memo='.$car_checkcode.'&rand='. $yzm;    $output = post_by_curl($remote_server, $post_string);    echo $output;    //return trim(getcontentbetween('<td align="center"  ><font size="5">','</font>',$output));}function get_by_curl($remote_server){    $cookiefile = realpath('cookie.txt');    $ch = curl_init($remote_server);     curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);//存储cookies    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);    curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);    $data = curl_exec($ch);    curl_close($ch);    //return $data;}function post_by_curl($remote_server, $post_string) {    $cookiefile = realpath('cookie.txt');	$ch = curl_init();	curl_setopt($ch, CURLOPT_HEADER, 0);	curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies    curl_setopt($ch, CURLOPT_URL, $remote_server);    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $data = curl_exec($ch);    curl_close($ch);    return $data;}

我不知道你的 valite 类是如何写的
但从 $valite->setImage("http://218.25.58.44/searchsys/img.jsp"); 就可知道是又发起了一次独立的 http 请求,因此 sessionid 就被改变了

阿。。神一样的回复

我不知道你的 valite 类是如何写的
但从 $valite->setImage("http://218.25.58.44/searchsys/img.jsp"); 就可知道是又发起了一次独立的 http 请求,因此 sessionid 就被改变了
你看的是我粘错的代码,下边的才是我改后的,出了N多错误。

主要就是你说的第2步那块,不知道怎么写了!“验证码图片 http://218.25.58.44/searchsys/img.jsp
从这个 url 获取图片流时,需将第1步读取的 cookie 发过去”

那得修改你的 valite 类
让他可以接受图片数据,而不是 url

valite就是接收的图片数据,问题是我现在不知道怎么写语句来取到http://218.25.58.44/searchsys/img.jsp这个图片类型的数据。我用curl get http://218.25.58.44/searchsys/img.jsp 后,得到的输入结果是乱码,要是能得出图片就能OK了。

????JFIF??C	    $.' ",#(7),01444'9=82<.342??C	  2!!22222222222222222222222222222222222222222222222222??<"??	 ???}!1AQa"q2??#B绷R佯$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?????????¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼????	 ???w!1AQaq"2?B?绷	#3R?br? $4?%?&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????ぅΗī?炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬????趸?+&?f?>a颉c蜱$2NF1???/?Y??5???5?*?76?腮FOe?+[T蟒?,>Z?环?`??9?'裣?格 找翁?撤l?%K8?觥_?(H9'	+leEG????巢?x???1?-?q?_??5?5?.??? ? ???<??ㄎ??4?%???????892O85?6?碍?=3??u,??Q???	A5??才訾?t_9??0??<?>钺?????m?/?盅?+;I	\?$2?嚆?4拙?H?:m柠? ?(*?]??8?<?Mr KV????萸?2?l?6???+?<易塔 ??5蕲??l?A'?Q&Kg,?癍??gY?t??赁}A?8?E吹苍/?4??$r?#H??F?R??!?~谭?#X?&??稞>ゥ…zQ??"点?$浯Q?O?Ke?.C6@?1?QW锌?5X??填?:^9?>怠b祧2?99)??y??q?E??E'???#?????=?~?)?眦?? ??@?>椟胪T?泷:j?嬷`%?銮??ㄠ?+'U_/P? ?>钽?3?锷4QMn:???

那得修改你的 valite 类
让他可以接受图片数据,而不是 url
现在问题就出在验证码这块儿,怎么才能在识别的验证码的同时,又取得同步的cookie?
我的识别验证码的函数的参数应该是个url或path+filename,但我不知道怎么用curl取得验证码(我用curl get http://218.25.58.44/searchsys/img.jsp根本就得不到图片类型的验证码)并得到cookie

如果你需要我帮你修改 valite,那么你至少需要给我他的代码

你的函数中都有 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
那么为什么抓取图片时就没有呢

如果你需要我帮你修改 valite,那么你至少需要给我他的代码

你的函数中都有 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
那么为什么抓取图片时就没有呢
不行啊,源码太长了,发不上来!如果可以的话,能不能给我个邮箱,我把源码发过去,您帮我看下,行吗?

如果你需要我帮你修改 valite,那么你至少需要给我他的代码

你的函数中都有 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
那么为什么抓取图片时就没有呢
这是部分源码:

class valite{	public function setImage($Image)	{		$this->ImagePath = $Image;	}	public function getData()	{		return $this->data;	}

这个验证函数应该是这样的 返回类型:4位数字 参数:图片文件的路径,可是怎么调用呢?要是简单的调用http://218.25.58.44/searchsys/img.jsp,可以得到正确的识别号码,但这样调用,就没法同步得到cookie

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。