phpでpdf,画像等取得

テスト勉強をするにあたって授業資料のpdfをいっぱい落としたかったので適当に.そんなことする暇あるなら勉強しろっていう話ですが...。

動作環境が限定しているものしか作っていないです。いつか改良を加える予定。

で,そのダウンロードしたいpdfがベーシック認証掛けられているページ上にあったのですが.そのページをfile_get_contentsするにはfile_get_contents(http://user:password@www.hoge.com/...)

という風に書けばよいらしいです.またuser,passwordに@が含まれている場合@を%40にエンコードしてやれば大丈夫らしい。passに@を付ける小癪な教官のおかげで1つ知識を増やすことができました。htmlタグは正規表現で取得してます。

baseurlは相対パスの場合に目的のコンテンツが置かれているまえのディレクトリを入れる,つまりindex.htmlを消したいだけ。

以下,コード

<?php
if(isset($_POST["url"])){
$url=$_POST['url'];
$folderName = $_POST["folderName"];
$baseurl=$_POST["baseurl"];
getPDFData($url, $folderName,$baseurl);
}


function getPDFData($url,$folderName,$baseurl){
//フォルダ作成
$url=$url;
$folderName=$folderName;
$baseurl=$baseurl;
if(!file_exists($folderName)){
mkdir($folderName, 0700);
}
//ベースURLの設定

$url=$url;
$folderName=$folderName;
$baseUrl=$baseurl;
$siteData = file_get_contents($url);
$siteData = mb_convert_encoding($siteData,'SJIS', "UTF-8");

//画像ネーム取得
if(preg_match_all("/<a href=\"(.+?).pdf/", $siteData, $match)) {


foreach($match[1] as $key => $value){
$imageUrl = $baseUrl.$value;

$imageData = file_get_contents($imageUrl.".pdf");

$pathInfo = pathinfo($value);
$fileName = $pathInfo["filename"];
//画像ファイルを取り出し保管する。
//$imageData=file_get_contents($imageUrl,FILE_BINARY);
if($imageData){
file_put_contents("./".$folderName."/".$fileName.".pdf",$imageData);
}
else{
echo "nainai\n";
}
}

}else{
echo "nai";
}
}
?>

twitterで指定リスト内のアカウントを全フォロー

やりたいことはあるリストに入っているアカウントを全部フォローすること.

まずtwitterの開発者ページに入り.OAuth認証を通すため,cosumerkey,Accesstokenを取得する.この際,アプリの説明用のWebページのURLが必要.read_onlyから変更してアカウント操作ができるようにする.なお,アプリ等を作るには複雑なことが必要っぽい.

tweepyのドキュメンテーションより,

import tweepy

auth=tweepy.OAuthHandler(consumer_key,consumer_secret)
auth.set_access_token(access_token,access_token_secret)

api=tweepy.API(auth)

を毎回おまじないとして書く.

consumer_key, consumer_secret, access_token, access_token_secretは先ほど取得したものを使う.

調べた結果リスト内のメンバーを返すのはlist_membersという関数.Cursorとかいろいろあって理解してないけどとりあえずStackOverflowに出てきたコードを使わせてもらった.

user_id="リスト保持者の(screen_nameとかid)"
slug="リストの名前"
list=[]
for member in tweepy.Cursor(api.list_members,user_id,slug).items():
	list.append(member.screen_name)
for i in range(0,len(list)):
	print list[i]
	
for i in range(0,len(list)):
	follow=api.show_friendship(target_screen_name=list[i])[1].followed_by
	request=api.show_friendship(target_screen_name=list[i])[1].following_received
	if(follow==False and request==False):
		api.create_friendship(list[i])

Cursorのとことかをうまく書き直すのと,show_friendshipの結果の出力を把握するのに時間がかかった.
show_friendshipは自分から相手への情報と相手の自分に対する情報を分けて返し,それぞれの中に辞書型配列(タプル)としてデータが格納されている.
なぜshow_friendshipを使ったかというと,すでにフォローしている相手や,鍵垢ですでにフォロリクを送っている相手をフォローしようとするとエラーが出るから.

途中寄り道してtweetを投稿しようとしたのだが,data must be a byte stringというエラーが出て使えない.これは後で調べる.文字コードとか関係してそう,わからん