MyController

WEB業界素人の僕がまた見返しそうなことのメモです。

Instagram APIから投稿日時を調べて指定時間を過ぎていたらメールでお知らせする方法

やりたかったこと。

本当はInstagramの投稿をして1時間後に自動削除をさせたかった。

だが公式マニュアルを読むとどうもコメントとかはできるけど投稿削除はできないっぽいのでとりあえずメールで自分に送ることにした。

 

 

最初の設定とかはここを見たら大体分かった

syncer.jp

 

 

■流れ

PHPだけでもいけるかもだけど書き方わからんのでシェルもつかった。

クーロンでシェルを動かす。

シェルからPHPファイルのURLを叩かせて最新の投稿情報を取得。

投稿時間を適当なテキストファイルに保存。

現在の時間ー1時間前の時刻とテキストの時間を比較して1時間以上経過していたらメールを送信するという流れ。

 

①クーロン

# 1時間おきに実行する
0 */1 * * * root /var/www/XXX.xxx/insta_timeline.sh

 

PHPファイル(API取得して投稿時間をテキストファイルに保存)

<?php

// 設定項目
$access_token = 'xxxxxxxxxxxxxxx' ; // アクセストークン
$request_url = 'https://api.instagram.com/v1/users/self/media/recent/?access_token=' . $access_token ; // リクエストURL

// アイテムデータをJSON形式で取得する (CURLを使用)
$curl = curl_init() ;

// オプションのセット
curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
curl_setopt( $curl , CURLOPT_HEADER, 1 ) ;
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数

// 実行
$res1 = curl_exec( $curl ) ;
$res2 = curl_getinfo( $curl ) ;

// 終了
curl_close( $curl ) ;

// 取得したデータ
$json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど)
$header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ)

// HTML用
$html = '' ;

// JSONデータをオブジェクト形式に変換する
$obj = json_decode( $json ) ;

// HTMLを作成
$html .= '<h2>実行結果</h2>' ;

// エラー判定
if( !$obj || !isset($obj->data) )
{
$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
}
else

{
foreach( $obj->data as $item )
{
// 各データ
$id = $item->id ; // メディアID
$type = $item->type ; // メディアタイプ
$link = $item->link ; // リンク
$images = $item->images->low_resolution->url ; // 画像
$date = $item->created_time ; // 日付 (UNIX TIMESTAMP)
$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ; // ライク数
$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ; // コメント数

// ユーザー情報
$user_id = $item->user->id ; // 投稿者ID
$user_name = $item->user->username ; // 投稿者のユーザーネーム
$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ; // 投稿者のユーザーネーム
$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ; // アイコン画

// 場所情報

$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ; // 場所ID
$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ; // 場所名
$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ; // 緯度
$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ; // 経度

 

$today = date( "Y/m/d H:i", time());
//echo 'today:'. $today;
//echo "<br />";

//今の時間から1時間ひく
$hour_ago = date("Y/m/d H:i", strtotime("$today -1 hour"));
//echo '1時間前は:'. $hour_ago;
//echo "<br />";

//投稿の時間
$date = date( 'Y/m/d H:i' , $date ) ;
echo '投稿時間は:'. $date;
//echo "<br />";

echo "instagramで投稿が見つかった為、ファイルに記録します";
echo $data;
file_put_contents('lastpost_instagram_time.txt', $date);


}
}

?>

 

シェルスクリプト

#!/bin/bash

cd /var/www/hubers.asia/

curl http://tes:tes@xxxxxx.xxx/insta_timeline.php
#今の時間
#date "+%Y/%m/%d %H:%M"

#マイナス1時間した時間
#date "+%Y/%m/%d %H:%M" -d "1 hour ago"
hour_ago=`date "+%Y/%m/%d %H:%M" -d "1 hour ago"`
#echo 1時間前は$hour_ago

#指定のファイルサイズが1以上なら真つまり文字が入ってれば真
if [ -s ./lastpost_instagram_time.txt ]; then

#この後の判定条件の為に数字に戻す
hour_ago=`date -d "$hour_ago" '+%s'`
filename=`date -d "$filename" '+%s'`

if [ $hour_ago -gt $filename ]; then
echo Instagrarm上に投稿が残っています。
echo instagramで1時間前よりも古い投稿があります!削除してください。 | mailx -s Instagramの投稿を削除してください。 xxxxxx@xxxxxxxxco.jp

#lastpost_instagram_time.txtを空にする
: > lastpost_instagram_time.txt
fi
#ファイルの中身がなければなにもしない
else
echo Instagramで消し忘れた投稿はありません。
fi