热搜:NVER node 开发 php

PHP发送微博失败

2024-09-18 22:40:01
PHP发送微博失败

PHP 微博 Windows

如题,数据包是用FIDDLER抓取的
POST http://weibo.com/aj/mblog/add?_wv=5&__rnd=1374042943531 HTTP/1.1
Host: weibo.com
Connection: keep-alive
Content-Length: 85
Origin: http://weibo.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 SE 2.X MetaSr 1.0
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://weibo.com/111690558?topnav=1&wvr=5
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: SINAGLOBAL=9465448379050.94.1363149364838; __utma=182865017.444875141.1368123665.1368123665.1368123665.1; __utmz=182865017.1368123665.1.1.utmcsr=weibo.com|utmccn=(referral)|utmcmd=referral|utmcct=/111690558; un=15060958332; wvr=5; tips_1690464047=1; USRHAWB=usrmdins540_129; SUE=es%3D507eea8961adc4be8745ced26692cecf%26ev%3Dv1%26es2%3D60cde3f363e58640ff977cc494b9b324%26rs0%3DHOCml5t36I5CpM5fJt6Zoy8AOhOq%252FrcttFUN3DWVH1vp%252FHzTj0d2WIlTRp8FTL8AfkFeIQhGdz873EpBI85zZxQXH%252FZlFrNQ8v3cFXgDWIi%252BjUink2UnhThidtqeofdZ83%252BE7tm6z2KhuWJ1h6yaQ5vUIrX39if85caUor0EJzg%253D%26rv%3D0; SUP=cv%3D1%26bt%3D1374020329%26et%3D1374106729%26d%3Dc909%26i%3D9e53%26us%3D1%26vf%3D0%26vt%3D0%26ac%3D2%26st%3D0%26uid%3D1690464047%26name%3D15060958332%2540sina.cn%26nick%3D15060958332%26fmp%3D%26lcp%3D; SUS=SID-1690464047-1374020329-GZ-57e6f-e2b33deb6283a87d733e40d63e8f7ee9; ALF=1376127464; SSOLoginState=1374020329; USRUG=usrmdins1540_23; _s_tentry=login.sina.com.cn; Apache=7815071931108.832.1374020351610; ULV=1374020351624:608:64:33:7815071931108.832.1374020351610:1373988030276; UOR=,weibo.com,bbs.fzu.edu.cn; SinaRot_wb_r_topic=94; arp_scroll_position=0

text=test&pic_id=&rank=0&rankid=&_surl=&hottopicid=&location=home&module=stissue&_t=0

正常发送时数据包如上

依照这个格式写的PHP如下

<?php$srv_ip = 'weibo.com';$srv_port = 80;$fp = '';$errno = 0;$errstr = '';$timeout = 10;$weibo_time=explode(' ',microtime());$weibo_time=$weibo_time[1].$weibo_time[0][2].$weibo_time[0][3].$weibo_time[0][4];$url = "http://weibo.com/aj/mblog/add?_wv=5&__rnd=$weibo_time"; $fp = fsockopen($srv_ip,$srv_port,$errno,$errstr,$timeout);if (!$fp){ echo('fp fail');}$content_length = strlen($post_str);$post_header = "POST $url HTTP/1.1\r\n";$post_header.="Host: weibo.com\r\n";$post_header.="Connection: keep-alive\r\n";$post_header.="Content-Length: ".$content_length."\r\n";$post_header.="Origin: http://weibo.com\r\n";$post_header.="X-Requested-With: XMLHttpRequest\r\n";$post_header.="User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 SE 2.X MetaSr 1.0\r\n";$post_header.="Content-Type: application/x-www-form-urlencoded\r\n";$post_header.="Accept: */*\r\n";$post_header.="Referer: http://weibo.com/111690558?topnav=1&wvr=5\r\n";$post_header.="Accept-Encoding: gzip,deflate,sdch\r\n";$post_header.="Accept-Language: zh-CN,zh;q=0.8\r\n";$post_header.="Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3\r\n";$post_header.="Cookie: SINAGLOBAL=9465448379050.94.1363149364838; __utma=182865017.444875141.1368123665.1368123665.1368123665.1; __utmz=182865017.1368123665.1.1.utmcsr=weibo.com|utmccn=(referral)|utmcmd=referral|utmcct=/111690558; un=15060958332; wvr=5; tips_1690464047=1; USRHAWB=usrmdins540_129; SUE=es%3D507eea8961adc4be8745ced26692cecf%26ev%3Dv1%26es2%3D60cde3f363e58640ff977cc494b9b324%26rs0%3DHOCml5t36I5CpM5fJt6Zoy8AOhOq%252FrcttFUN3DWVH1vp%252FHzTj0d2WIlTRp8FTL8AfkFeIQhGdz873EpBI85zZxQXH%252FZlFrNQ8v3cFXgDWIi%252BjUink2UnhThidtqeofdZ83%252BE7tm6z2KhuWJ1h6yaQ5vUIrX39if85caUor0EJzg%253D%26rv%3D0; SUP=cv%3D1%26bt%3D1374020329%26et%3D1374106729%26d%3Dc909%26i%3D9e53%26us%3D1%26vf%3D0%26vt%3D0%26ac%3D2%26st%3D0%26uid%3D1690464047%26name%3D15060958332%2540sina.cn%26nick%3D15060958332%26fmp%3D%26lcp%3D; SUS=SID-1690464047-1374020329-GZ-57e6f-e2b33deb6283a87d733e40d63e8f7ee9; ALF=1376127464; SSOLoginState=1374020329; USRUG=usrmdins1540_23; _s_tentry=login.sina.com.cn; Apache=7815071931108.832.1374020351610; ULV=1374020351624:608:64:33:7815071931108.832.1374020351610:1373988030276; UOR=,weibo.com,bbs.fzu.edu.cn; SinaRot_wb_r_topic=94; arp_scroll_position=0\r\n\r\n";$post_header.="text=test&pic_id=&rank=0&rankid=&_surl=&hottopicid=&location=home&module=stissue&_t=0";echo $post_header;fwrite($fp,$post_header); $inheader = 1;while(!feof($fp)){ $line = fgets($fp,1024); if ($inheader && ($line == "\n" || $line == "\r\n")) { $inheader = 0;  }  if ($inheader == 0) { echo $line;  }} fclose($fp); unset ($line); ?>



得到的结果是

301 Moved Permanently

301 Moved Permanently


nginx


可是把这个数据包复制到FIDDLER等工具中发送,明明就是成功的,是PHP哪里有问题了吗

有的文章中说数据包POST_STR后面部分应该加上\r\n\r\n的,我也都试过了,加两个,加一个,不加,都是失败的

PS:我是在命令行下用的PHP


回复讨论(解决方案)

可能还是cookie的问题,你把

我之前用ruby写过一个自动刷评论别人微博的程序,给你参考下。类似于微博上的那种广告机器人。
运行后会自动评论指定微博地址的最新一条微博,10秒钟评论一次。评论内容最后我加了很长的随机串来防止被新浪过滤。

运行环境:ruby1.9+

#! /usr/local/bin/ruby -w# -*- coding: UTF-8 -*-require 'net/http'class Auto_comment	@@comment_url = 'http://weibo.com/aj/comment/add?_wv=5&__rnd=13811801512'	@@headers = {		'Cookie' => '[这里换成你的cookie]',		'Referer' => 'http://weibo.com',		'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',		'Content-Type' => 'application/x-www-form-urlencoded'	}	def exec weibo, content		@weibo = weibo		@content = content		check_new_post	end	private		def create_salt    	    	chars = ("a".."z").to_a    	newpass = ""    	1.upto(100) { |i| newpass << chars[rand(chars.size-1)] }    	newpass	end	def check_new_post		uri = URI.parse @weibo		req = Net::HTTP::Get.new uri.request_uri, @@headers		res = Net::HTTP.start uri.host, uri.port do |http|			http.request(req)		end		mid_list = res.body.scan( /mid=\\\"(.*?)\\\"/ )				mid = mid_list.first[0].to_s		comment mid	end		def comment mid		postfields = { 			:act => 'post',			:mid => mid,			:forward => '0',			:isroot => '0',			:content => @content+"_防新浪过滤重复内容随机串{"+create_salt+"}",			:type => 'big',			:location => 'mblog',			:module => 'bcommlist',			:tranandcomm => '1',			:_t => '0'		}		uri = URI.parse @@comment_url			http = Net::HTTP.new( uri.host, 80)			field = ''		postfields.each do |k, v|			field += "#{k}=#{v}&"		end				field.chop!				http.post uri.request_uri, field, @@headers	endend#要评论的微博地址weibo = 'http://weibo.com/u/1777627917'content = '自动评论程序测试'comment = Auto_comment.new#每10秒钟评论一次loop do	comment.exec weibo, content	sleep 10end

可能还是cookie的问题,你把

我之前用ruby写过一个自动刷评论别人微博的程序,给你参考下。类似于微博上的那种广告机器人。
运行后会自动评论指定微博地址的最新一条微博,10秒钟评论一次。评论内容最后我加了很长的随机串来防止被新浪过滤。

运行环境:ruby1.9+

#! /usr/local/bin/ruby -w# -*- coding: UTF-8 -*-require 'net/http'class Auto_comment	@@comment_url = 'http://weibo.com/aj/comment/add?_wv=5&__rnd=13811801512'	@@headers = {		'Cookie' => '[这里换成你的cookie]',		'Referer' => 'http://weibo.com',		'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',		'Content-Type' => 'application/x-www-form-urlencoded'	}	def exec weibo, content		@weibo = weibo		@content = content		check_new_post	end	private		def create_salt    	    	chars = ("a".."z").to_a    	newpass = ""    	1.upto(100) { |i| newpass << chars[rand(chars.size-1)] }    	newpass	end	def check_new_post		uri = URI.parse @weibo		req = Net::HTTP::Get.new uri.request_uri, @@headers		res = Net::HTTP.start uri.host, uri.port do |http|			http.request(req)		end		mid_list = res.body.scan( /mid=\\\"(.*?)\\\"/ )				mid = mid_list.first[0].to_s		comment mid	end		def comment mid		postfields = { 			:act => 'post',			:mid => mid,			:forward => '0',			:isroot => '0',			:content => @content+"_防新浪过滤重复内容随机串{"+create_salt+"}",			:type => 'big',			:location => 'mblog',			:module => 'bcommlist',			:tranandcomm => '1',			:_t => '0'		}		uri = URI.parse @@comment_url			http = Net::HTTP.new( uri.host, 80)			field = ''		postfields.each do |k, v|			field += "#{k}=#{v}&"		end				field.chop!				http.post uri.request_uri, field, @@headers	endend#要评论的微博地址weibo = 'http://weibo.com/u/1777627917'content = '自动评论程序测试'comment = Auto_comment.new#每10秒钟评论一次loop do	comment.exec weibo, content	sleep 10end

那你COOKIE是怎么获取的,RND参数应该和时间同步吧。。??我去掉后发现不能正常了,COOKIE应该是没错的,我把PHP要发送的数据包ECHO出来用其他软件发送都可以

__rnd参数我给了一个定值就可以。去掉可能不行,但可以给一个定值。
cookie我是从chrome的审查元素里面取到的。

如果确定cookie没问题的话,你把发送的http头精简下,跟我一样只发送4个域。因为你那结果是301,所以我还是怀疑是你cookie验证的部分没有通过。


之前我也用php写过几个操作微博的,如自动发微博,自动关注别人等等,不过代码没有存。所以没法发出来给你参考了。

__rnd参数我给了一个定值就可以。去掉可能不行,但可以给一个定值。
cookie我是从chrome的审查元素里面取到的。

如果确定cookie没问题的话,你把发送的http头精简下,跟我一样只发送4个域。因为你那结果是301,所以我还是怀疑是你cookie验证的部分没有通过。


之前我也用php写过几个操作微博的,如自动发微博,自动关注别人等等,不过代码没有存。所以没法发出来给你参考了。
只留四个的头部还是不行依然是301,真不明白。。

$post_str 在哪?

$post_header.="text=test&pic_id=&rank=0&rankid=&_surl=&hottopicid=&location=home&module=stissue&_t=0";
post的数据不应该加入header,应该用curl相关参数处理

$post_str 在哪?

$post_header.="text=test&pic_id=&rank=0&rankid=&_surl=&hottopicid=&location=home&module=stissue&_t=0";
post的数据不应该加入header,应该用curl相关参数处理
测试时发现content length随便都可以的所以poststr我就去掉了

问题是CURL在命令行下CURL模块是没开启的

而且其他的网站都不会有这个问题我也想知道到底的什么情况。

没用看到 Connection:close
也没有看到 Content-length:nnn

一般的说,post数据的长度,在 Connection:close 前声明,数据体附加在正文中,即Connection:close之后

没用看到 Connection:close
也没有看到 Content-length:nnn

一般的说,post数据的长度,在 Connection:close 前声明,数据体附加在正文中,即Connection:close之后
正常发送的时候数据是这样的
另外PHP中的也是和正常发送的一样是KEEP-ALIVE在第三行