摘要:微博圖床對(duì)于微博圖床的理解得力于這篇文章利用微博當(dāng)圖床語(yǔ)言實(shí)現(xiàn)。源碼如下上傳圖片到微博圖床圖片文件圖片是否采用方式上傳返回的數(shù)據(jù)微博提交正則表達(dá)式提取返回結(jié)果中的數(shù)據(jù)微博機(jī)器人源碼列舉了所要用到的幾個(gè)重要,最后還是貼一下機(jī)器人的源碼吧。
? 在2011年的時(shí)候,浙大的一位博士生借助微博的開放平臺(tái)為他實(shí)驗(yàn)室的一臺(tái)飲水機(jī)弄了個(gè)微博,名喚@浙大CCNT實(shí)驗(yàn)室飲水機(jī),俗稱“飲水機(jī)娘“。當(dāng)年這條新聞給自己留下了挺大的印象,也一直對(duì)這個(gè)微博賬號(hào)可以自動(dòng)發(fā)微博背后的機(jī)理感到十分憧憬。一晃,時(shí)間都來(lái)到了2019年了~~
? 咳咳——在鉆研不少技術(shù)文章以及對(duì)技術(shù)派網(wǎng)友的多多請(qǐng)教后,自己終于也搗弄了一個(gè)自動(dòng)發(fā)微博的機(jī)器人( ̄︶ ̄)↗
? 此微博機(jī)器人的功能如下:
直接模擬登陸新浪微博;
自動(dòng)獲取唐詩(shī)宋詞文本;
自動(dòng)獲取文藝主題圖片;
自動(dòng)上傳圖片至微博圖床;
自動(dòng)發(fā)送內(nèi)容不同的圖文微博;
通過(guò)定時(shí)任務(wù),實(shí)現(xiàn)周期性發(fā)微博任務(wù)。
? 實(shí)際效果圖:
? GitHub倉(cāng)庫(kù):
https://github.com/Leslie-Won...
? 正所謂“前不見(jiàn)古人,后不見(jiàn)來(lái)者。念天地之悠悠,獨(dú)愴然而涕下!“,咳咳——IT技術(shù)世界當(dāng)然不是這樣,我們的技術(shù)積累都是站在前人的基礎(chǔ)上的,換言之,站在巨人的肩膀上。所以,還是先來(lái)啰嗦啰嗦當(dāng)年的飲水機(jī)娘。
飲水機(jī)娘分析? 當(dāng)年果殼網(wǎng)在飲水機(jī)娘爆紅了的時(shí)候,采訪了背后的開發(fā)者——浙江大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院的一位陳姓博士生。文章標(biāo)題是《揭開“飲水機(jī)娘”的神秘面紗》。在這篇文章中,闡述發(fā)微博原理的段落如下:
據(jù)陳同學(xué)介紹,飲水機(jī)本身并沒(méi)有多加改造,只是飲水機(jī)上安裝一個(gè)攝像頭,鏡頭正對(duì)加熱指示燈,作為傳感器,實(shí)時(shí)監(jiān)控加熱狀態(tài)。發(fā)送微博的功能通過(guò)代碼實(shí)現(xiàn),利用了新浪微博開放平臺(tái)提供的PHP語(yǔ)言軟件開發(fā)工具包。在代碼的設(shè)計(jì)中,主要有檢測(cè)模塊和反應(yīng)模塊兩部分。檢測(cè)模塊處理攝像頭的監(jiān)控?cái)?shù)據(jù),捕捉加熱指示燈“亮->不亮”與“不亮->亮”兩個(gè)切換狀態(tài),然后調(diào)用反應(yīng)模塊及時(shí)發(fā)送微博。所以在“飲水機(jī)娘”自動(dòng)發(fā)送的微博下方,會(huì)顯示“來(lái)自未通過(guò)審核應(yīng)用”。目前,完成這些功能,所需的代碼量不足兩百行。
? 現(xiàn)在來(lái)分析分析這兩段話,把整個(gè)流程弄成流程圖的話是如下的效果:
? 從“指示燈”到“視覺(jué)算法判斷狀態(tài)”這部分屬于計(jì)算機(jī)視覺(jué)實(shí)現(xiàn)了,依本人目前的技術(shù)視野判斷,可以借助openCV來(lái)構(gòu)建。至于發(fā)送微博這一部分,則是純粹的PHP代碼實(shí)現(xiàn)。由于本文所要討論的是構(gòu)建一個(gè)發(fā)微博的機(jī)器人,而微博報(bào)文數(shù)據(jù)的獲取可以有很多種方式,因此,openCV就點(diǎn)到為止了。(自己也不是太懂openCV)(。?_?)/~~~
? 自己在查閱了不少技術(shù)文獻(xiàn)后,通過(guò)這篇《新浪微博自動(dòng)(模擬)登陸詳解及實(shí)現(xiàn)》了解到飲水機(jī)娘發(fā)送的微博下方會(huì)出現(xiàn)“來(lái)自未通過(guò)審核應(yīng)用”是由于用了新浪微博開放平臺(tái)的接口的緣故,而且其會(huì)有幾個(gè)比較致命的限制(調(diào)用次數(shù)限制和授權(quán)期限限制)。網(wǎng)上流傳一種直接模擬登陸微博的解決方案,關(guān)鍵點(diǎn)就是利用php的curl功能,這也是本人所要闡述的微博機(jī)器人使用的登錄原理。
? 另外,翻了翻飲水機(jī)娘最早期發(fā)送的微博,報(bào)告飲水機(jī)水沸騰了的微博報(bào)文是這樣子的——
? 后來(lái)變成了這樣子——
? 而對(duì)應(yīng)“亮->不亮”狀態(tài)的微博報(bào)文最初是這樣子的——
? 不過(guò),后來(lái)關(guān)注度上去之后,就很難判斷飲水機(jī)娘發(fā)送的微博是不是根據(jù)飲水機(jī)狀態(tài)自動(dòng)發(fā)出去了的了,但是也不影響本文后續(xù)的敘述。OK,溯源的部分就到這里,接下來(lái)講講在機(jī)器人構(gòu)建中占據(jù)不少分量的數(shù)據(jù)獲取API——今日詩(shī)詞API、文藝主題圖片API、微博圖床API。
今日詩(shī)詞API? 今日詩(shī)詞API是亂碼開發(fā)的一個(gè)可以返回一句古詩(shī)詞名句的接口。它可以通過(guò)圖片和JSON格式調(diào)用。今日詩(shī)詞API根據(jù)不同地點(diǎn)、時(shí)間、節(jié)日、季節(jié)、天氣、景觀、城市、事件進(jìn)行智能推薦。
? 官方文檔地址是https://www.jinrishici.com/, 亂碼大佬撰寫的介紹文章則是https://luan.ma/post/jinrishici/。就本人所要構(gòu)建的微博機(jī)器人而言,使用到的接口是https://v2.jinrishici.com/one...,而且是使用帶token的調(diào)用方式。
文藝主題圖片API? 這個(gè)圖片API是九凌少子負(fù)責(zé)開發(fā)的,他的圖源來(lái)自于360壁紙,主要功能就是根據(jù)調(diào)用需求,返回一張360壁紙的官方服務(wù)器上的圖片URL。調(diào)用方式如下:
https://www.yuluoge.com/api/i...
? 不同的cid值對(duì)應(yīng)不同的分類,根據(jù)他的解釋及本人測(cè)試,分類如下——
cid=0 —— 默認(rèn)圖片,不分類型
cid=1 —— 美女
cid=2 —— 動(dòng)漫
cid=3 —— 風(fēng)景
cid=4 —— 游戲
cid=5 —— 文藝
cid=6 —— 文字控
cid=7 —— 動(dòng)物
cid=8 —— 愛(ài)情
? 此外,這篇文章最后貼出來(lái)的源代碼是基于他在今日詩(shī)詞的Q群里分享的發(fā)微博源碼改造而來(lái)的,在此感謝他的貢獻(xiàn)。
微博圖床API? 對(duì)于微博圖床API的理解得力于這篇文章——《利用微博當(dāng)圖床-php語(yǔ)言實(shí)現(xiàn)》。
? 使用到的微博圖片上傳接口為
http://picupload.service.weib...
? 本文所構(gòu)建機(jī)器人略有改動(dòng)地使用了這篇文章里的獲取新浪圖床圖片pid的PHP源碼。源碼如下:
/** * 上傳圖片到微博圖床 * @author mengkun http://mkblog.cn * @param $file 圖片文件/圖片url * @param $multipart 是否采用multipart方式上傳 * @return 返回的json數(shù)據(jù) */ function upload($file, $multipart = true) { $cookie = ""; // 微博cookie $url = "http://picupload.service.weibo.com/interface/pic_upload.php" ."?mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog"; if($multipart) { $url .= "&cb=http://weibo.com/aj/static/upimgback.html?_wv=5&callback=STK_ijax_".time(); if (class_exists("CURLFile")) { // php 5.5 $post["pic1"] = new CURLFile(realpath($file)); } else { $post["pic1"] = "@".realpath($file); } } else { $post["b64_data"] = base64_encode(file_get_contents($file)); } // Curl提交 $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_POST => true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array("Cookie: $cookie"), CURLOPT_POSTFIELDS => $post, )); $output = curl_exec($ch); curl_close($ch); // 正則表達(dá)式提取返回結(jié)果中的json數(shù)據(jù) preg_match("/({.*)/i", $output, $match); if(!isset($match[1])) return ""; return $match[1]; }微博機(jī)器人源碼
? 列舉了所要用到的幾個(gè)重要API,最后還是貼一下機(jī)器人的源碼吧。當(dāng)然,也有相對(duì)應(yīng)的GitHub倉(cāng)庫(kù)https://github.com/Leslie-Won...
主模塊
//weibo.php true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array("Cookie: $cookie"), CURLOPT_POSTFIELDS => $post, )); $output = curl_exec($ch); curl_close($ch); // 正則表達(dá)式提取返回結(jié)果中的json數(shù)據(jù) preg_match("/({.*)/i", $output, $match); if(!isset($match[1])) return ""; return $match[1]; } /** 通過(guò)今日詩(shī)詞API獲取詩(shī)詞內(nèi)容 **/ function jinrishici(){ $opts = array( "http"=>array( "method"=>"GET", "header"=>"Accept-language: en "."X-User-Token: k4z4CMgTyl3JN6s+y2iWWiHN6we+0J9V " ) ); $context = stream_context_create($opts); // Open the file using the HTTP headers set above $tangshi_pailie = json_decode(file_get_contents("https://v2.jinrishici.com/one.json", false, $context),true); //今日詩(shī)詞API,帶token版本 // $tangshi_pailie = json_decode(file_get_contents("https://v2.jinrishici.com/one.json"), true); //今日詩(shī)詞api,不帶token版本 $tangshi_title = $tangshi_pailie["data"]["origin"]["title"]; //標(biāo)題 $tangshi_dynasty = $tangshi_pailie["data"]["origin"]["dynasty"]; //朝代 $tangshi_author = $tangshi_pailie["data"]["origin"]["author"]; //詩(shī)人 $tangshi_line_numbers = count($tangshi_pailie["data"]["origin"]["content"]); $tangshi_content = $tangshi_pailie["data"]["origin"]["content"][0]; for ($i=1; $i < $tangshi_line_numbers; $i++) { $tangshi_temp_line = $tangshi_pailie["data"]["origin"]["content"][$i]; $tangshi_content = $tangshi_content." ".$tangshi_temp_line; } //拼接全詩(shī) $post_Poem = "《".$tangshi_title."》"." ".$tangshi_dynasty."·".$tangshi_author." "." ".$tangshi_content; return "$post_Poem"; } include "./wbcookie.php"; $cookie = $config["cookie"]; //通過(guò)圖片api獲取圖片,并轉(zhuǎn)存微博圖床 $bing_img = json_decode(upload("https://www.yuluoge.com/api/index.php?cid=5", $cookie, false),true); $bing_img_pid = $bing_img["data"]["pics"]["pic_1"]["pid"]; echo "$bing_img_pid "; $tangshi = jinrishici(); echo "$tangshi "; $post=[ "title" =>"今日要說(shuō)什么?", "location" => "v6_content_home", "text" => "#詩(shī)詞[超話]# #中華好詩(shī)詞# #中國(guó)詩(shī)詞大會(huì)#"." ".$tangshi." "." ",//需要發(fā)送微博的內(nèi)容 "pic_id" => "$bing_img_pid", // "007CcEyfly1g042kquhztj31ns0u0tdu",//微博圖片id,需事先上傳好 "isReEdit" => false, "pub_source" => "page_2", "topic_id" => "1022%3A", "pub_type" => "dialog", "_t" => 0, "style_type" => 1, ]; $url="https://weibo.com/aj/mblog/add?ajwvr=6&__rnd=2918942797035";//不需要改變 $referer="https://weibo.com/liufengshishe/home?topnav=1&wvr=6";//你的微博用戶名(首頁(yè)鏈接) $response = curl($url,$post,"",$cookie,$referer); echo "$response 發(fā)送成功";
微博登錄模塊
20*3600||$config["cookie"]=="SUB;") { $cookie = login($sinauser,$sinapwd); if($cookie&&$cookie!="SUB;") { CookieSet($cookie,$time = time()); } else { return error("203","獲取cookie出現(xiàn)錯(cuò)誤,請(qǐng)檢查賬號(hào)狀態(tài)或者重新獲取cookie"); } } /** * 新浪微博登錄(無(wú)加密接口版本) * @param string $u 用戶名 * @param string $p 密碼 * @return string 返回最有用最精簡(jiǎn)的cookie */ function login($u,$p){ $loginUrl = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543"; $loginData["entry"] = "sso"; $loginData["gateway"] = "1"; $loginData["from"] = "null"; $loginData["savestate"] = "30"; $loginData["useticket"] = "0"; $loginData["pagerefer"] = ""; $loginData["vsnf"] = "1"; $loginData["su"] = base64_encode($u); $loginData["service"] = "sso"; $loginData["sp"] = $p; $loginData["sr"] = "1920*1080"; $loginData["encoding"] = "UTF-8"; $loginData["cdult"] = "3"; $loginData["domain"] = "sina.com.cn"; $loginData["prelt"] = "0"; $loginData["returntype"] = "TEXT"; return loginPost($loginUrl,$loginData); } /** * 發(fā)送微博登錄請(qǐng)求 * @param string $url 接口地址 * @param array $data 數(shù)據(jù) * @return json 算了,還是返回cookie吧//返回登錄成功后的用戶信息json */ function loginPost($url,$data){ $tmp = ""; if(is_array($data)){ foreach($data as $key =>$value){ $tmp .= $key."=".$value."&"; } $post = trim($tmp,"&"); }else{ $post = $data; } $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$post); $return = curl_exec($ch); curl_close($ch); return "SUB" . getSubstr($return,"Set-Cookie: SUB","; ") . ";"; } /** * 取本文中間 */ function getSubstr($str,$leftStr,$rightStr){ $left = strpos($str, $leftStr); echo "左邊:".$left; $right = strpos($str, $rightStr,$left); echo "
右邊:".$right; if($left <= 0 or $right < $left) return ""; return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr)); } /** 設(shè)置cookie文件 */ function CookieSet($cookie,$time){ $newConfig = " "".$cookie."", "time" => "".$time."", );"; @file_put_contents("./wbcookie.php", $newConfig); } /** 錯(cuò)誤反饋 */ function error($code,$msg){ $arr = array("code"=>$code,"msg"=>$msg); echo json_encode($arr); }
微博賬號(hào)模塊
關(guān)于如何使用? 本地搭建了lamp環(huán)境的話,開啟lamp環(huán)境后,直接在瀏覽器地址欄輸入localhost及主入口文件對(duì)應(yīng)的路徑就可以運(yùn)行了(本人使用xampp)。
? 云服務(wù)器的話,本人的方案是使用寶塔服務(wù)器面板安裝lamp環(huán)境后,使用xftp將文件傳到apache服務(wù)器網(wǎng)站根目錄上,開啟lamp環(huán)境就可以了的。
關(guān)于安全性問(wèn)題? 實(shí)不相瞞,如果是在云服務(wù)器上直接跑這些php文件的話,是不太安全的。因?yàn)榫W(wǎng)站的公共用戶具有可以訪問(wèn)微博賬號(hào)文件的權(quán)限。所以,推薦對(duì)微博賬號(hào)文件進(jìn)行.htaccess設(shè)置,也推薦申請(qǐng)個(gè)小號(hào)來(lái)搭建。
? 具體操作有點(diǎn)復(fù)雜,可以參考這篇文章——《apache .htaccess文件詳解和配置技巧總結(jié)》
關(guān)于定時(shí)任務(wù)? 設(shè)置定時(shí)任務(wù)的話可以使用linux主機(jī)的crontab命令。
遠(yuǎn)程連接主機(jī),連接成功后,輸入命令crontab -e;
會(huì)打開一個(gè)文件,按照格式輸入需要執(zhí)行的腳本;
保存退出后,重啟crontab服務(wù)。
語(yǔ)法解釋:
“*” 代表取值范圍內(nèi)的數(shù)字,
參考文獻(xiàn)
“/” 代表”每”,
“-” 代表從某個(gè)數(shù)字到某個(gè)數(shù)字,
“,” 分開幾個(gè)離散的數(shù)字《揭開“飲水機(jī)娘”的神秘面紗》《新浪微博自動(dòng)(模擬)登陸詳解及實(shí)現(xiàn)》
《今日詩(shī)詞開放接口-調(diào)用文檔》
《利用微博當(dāng)圖床-php語(yǔ)言實(shí)現(xiàn)》
《apache .htaccess文件詳解和配置技巧總結(jié)》
《linux下crontab定時(shí)訪問(wèn)指定url》
特別致謝九凌少子
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/31020.html
摘要:僅供學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途,并遵守新浪微博相關(guān)規(guī)定。代碼目錄此微博機(jī)器人的實(shí)現(xiàn)功能如下模擬登陸新浪微博獲取自動(dòng)上傳圖片至微博圖床自動(dòng)發(fā)送內(nèi)容不同的圖文微博通過(guò)定時(shí)任務(wù),實(shí)現(xiàn)周期性發(fā)微博任務(wù)。 僅供學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途,并遵守新浪微博相關(guān)規(guī)定。 代碼目錄 showImg(https://segmentfault.com/img/bVbqe6W?w=634&h=580); 此微博...
摘要:今天就用來(lái)上傳圖片到微博,這也是來(lái)自的一個(gè)問(wèn)題里面還提到一個(gè)版本有種方式實(shí)現(xiàn)上傳圖片如果要用這個(gè)的話參數(shù)必須是,值為經(jīng)過(guò)編碼后的字符串。使用上傳登錄微博獲取就是微博圖片,訪問(wèn)即可打開圖片這里我上傳的是的廣告圖。 微博是個(gè)好圖床,上傳后就可以通過(guò)一個(gè)url來(lái)訪問(wèn)了。今天就用php來(lái)上傳圖片到微博,這也是來(lái)自sf的一個(gè)問(wèn)題, 里面還提到一個(gè)python版本. 有2種方式實(shí)現(xiàn)上傳圖片: 如...
摘要:個(gè)月后,我通過(guò)個(gè)產(chǎn)品達(dá)到了萬(wàn)美元的月收入。其中第一個(gè)產(chǎn)品貢獻(xiàn)了收入的以上。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdow...
摘要:多域名配置原來(lái)的域名過(guò)期了,重新買了一個(gè),正好重新的配置一下,針對(duì)之前寫過(guò)的幾個(gè)不同的東西,通過(guò)不同的子域名來(lái)進(jìn)行區(qū)分,因此簡(jiǎn)單記錄一下的多域名配置域名配置背景因?yàn)橘Y金有限,只有一臺(tái)服務(wù)器,但是這個(gè)服務(wù)器上干的事情卻不止一件,當(dāng)前的狀況是有 nginx多域名配置 原來(lái)的域名過(guò)期了,重新買了一個(gè)hhui.top,正好重新的配置一下,針對(duì)之前寫過(guò)的幾個(gè)不同的東西,通過(guò)不同的子域名來(lái)進(jìn)行區(qū)分...
摘要:本文轉(zhuǎn)載自微信公眾號(hào)賬號(hào),作者為海航生態(tài)科技技術(shù)研究院大數(shù)據(jù)開發(fā)工程師高顏。文章介紹了海航生態(tài)科技輿情大數(shù)據(jù)平臺(tái)的容器化改造經(jīng)驗(yàn),包括初期技術(shù)架構(gòu)應(yīng)用容器化架構(gòu)遷移持續(xù)發(fā)布與部署。 本文轉(zhuǎn)載自微信公眾號(hào)Docker(賬號(hào):dockerone),作者為海航生態(tài)科技技術(shù)研究院大數(shù)據(jù)開發(fā)工程師高顏。 文章介紹了海航生態(tài)科技輿情大數(shù)據(jù)平臺(tái)的容器化改造經(jīng)驗(yàn),包括初期技術(shù)架構(gòu)、應(yīng)用容器化、架構(gòu)遷...
閱讀 999·2023-04-25 14:41
閱讀 2456·2021-09-28 09:35
閱讀 3627·2019-08-30 15:53
閱讀 1946·2019-08-29 15:26
閱讀 1071·2019-08-28 17:59
閱讀 4311·2019-08-26 13:45
閱讀 2842·2019-08-26 13:33
閱讀 1645·2019-08-26 11:46