Edited at

【質問】Instagram API (Modify the relationship between the current user and the target user.)

More than 3 years have passed since last update.


Instagram APIでのフォロー

Webブラウザ上でinstagramユーザーをフォローするプログラムを作りたいと思っています。

参考にさせて頂いているサイト(http://syncer.jp/instagram-api-matome)

をみながら作っています。

しかしエラー等出てしまい、フォローができません。


作成したソース

$params = array(

"access_token" => $access_token,
"action" => "follow",
);
$params = http_build_query($params);
$header = array(
"Content-Type: text/plain",
"Content-Length: ".strlen($params)
);
$obj = json_decode(file_get_contents(
"https://api.instagram.com/v1/users/{$user_id}/relationship",
false,stream_context_create(array("http" => array(
"method" => "POST",
'header' => implode(PHP_EOL,$header),
"content" => $params,
'ignore_errors' => true
)))
));

ほぼ参考にさせていただいたサイトそのままなのですが、先に進めなくなってしまいました。

Manage Clients内(https://instagram.com/developer/clients/manage/)

でEnforce signed requestsのチェックは入れています。(実際に必要かどうかわかりませんが。)

サーバー環境

* PHP Version 5.6.3

* Apache/2.4.10

* テスト用サーバーXAMPP Windows版

エラー内容を表示させると、以下の通りでした。


http_response_header

array(13) {

[0]=>
string(24) "HTTP/1.1 400 BAD REQUEST"
[1]=>
string(59) "Cache-Control: private, no-cache, no-store, must-revalidate"
[2]=>
string(20) "Content-Language: en"
[3]=>
string(45) "Content-Type: application/json; charset=utf-8"
[4]=>
string(35) "Date: Tue, 07 Jul 2015 05:38:19 GMT"
[5]=>
string(38) "Expires: Sat, 01 Jan 2000 00:00:00 GMT"
[6]=>
string(16) "Pragma: no-cache"
[7]=>
string(119) "Set-Cookie: csrftoken=トークン; expires=Tue, 05-Jul-2016 05:38:19 GMT; Max-Age=31449600; Path=/"
[8]=>
string(29) "Vary: Cookie, Accept-Language"
[9]=>
string(23) "X-Ratelimit-Limit: 5000"
[10]=>
string(27) "X-Ratelimit-Remaining: 4999"
[11]=>
string(19) "Content-Length: 282"
[12]=>
string(17) "Connection: Close"
}



file_get_contents

object(stdClass)#3 (1) {

["meta"]=>
object(stdClass)#4 (3) {
["error_type"]=>
string(25) "OAuthPermissionsException"
["code"]=>
int(400)
["error_message"]=>
string(201) "This request requires scope=relationships, but this access token is not authorized with this scope. The user must re-authorize your application with scope=relationships to be granted write permissions."
}
}


アクセストークンの取得など、同じPOST通信は出来ている状況です。

また以下の通り、apigee(https://apigee.com/console/instagram)

によるフォローではうまく動きました。

以下、apigeeの結果です。


Reques

Request

POST /v1/users/相手のユーザーID/relationship?access_token=取得したアクセストークン
HTTP/1.1
Host:api.instagram.com
Content-Length:13
X-Target-URI:https://api.instagram.com
Content-Type:text/plain; charset=UTF-8
Connection:Keep-Alive


Response

Content-Language:en

X-Ratelimit-Limit:5000
Date:Mon, 06 Jul 2015 01:23:45 GMT
Vary:Cookie, Accept-Language
Content-Length:89
Expires:Sat, 01 Jan 2000 00:00:00 GMT
X-Ratelimit-Remaining:4997
Set-Cookie:クッキー; expires=Mon, 04-Jul-2016 01:23:45 GMT; Max-Age=31449600; Path=/
Connection:keep-alive
Content-Type:application/json; charset=utf-8
Cache-Control:private, no-cache, no-store, must-revalidate
Pragma:no-cache
{
"meta": {
"code": 200
},
"data": {
"outgoing_status": "follows",
"target_user_is_private": false
}
}

何か原因等お気づきの点がありましたら、コメントいただけるとありがたいです。

【2015.07.07追記01】

以下の申請箇所を見つけた為、入力・申請をかけてみました。

https://help.instagram.com/contact/185819881608116

【2015.07.07追記02】

ユーザーがアクセスした場合、一度instagramの認証画面に飛びます。

その際の表示内容ですが、他サイトでは


Hi 自分の名前 ,アプリ名 is requesting to do the following:

Access your basic information

includes photos, friend lists & profile info

Follow/unfollow other users

Only with your express permission

Like photos

Only with your express permission


と表示され、Authorizeボタンを押して認証する形ですが、自分の作成したWebアプリでは、


Hi 自分の名前 ,アプリ名 is requesting to do the following:

Access your basic information

includes photos, friend lists & profile info


としか表示がありませんでした。

当然、scope部分を確認しましたが、認証画面のURL自体も

https://instagram.como/auth/authorize/?client_id=クライアントID&redirect_uri=リダイレクトURI&scope=basic+comments+relationships+likes&response_type=code

となっており、relationshipsのパーミッション設定をしていたはずなのですが、認証画面に反映されていないようです。

引き続き、何か原因等お気づきの点がありましたら、コメントいただけるとありがたいです。


追記【2015.07.13】

Instagram Manage ClientsのEdit Client内、Enforce signed requestsへチェックを入れ、

https://instagram.com/developer/clients/manage/

Instagram デベロッパーページの

https://instagram.com/developer/secure-api-requests/

を参考に、


curl

<?php

function generate_sig($endpoint, $params, $client_secret) {
$sig = $endpoint;
ksort($params);
foreach ($params as $key => $val) {
$sig .= "|$key=$val";
}
return hash_hmac('sha256', $sig, $client_secret, false);
}

$params = array(
'access_token' => 取得したアクセストークン,
"action" => "follow",
);
$client_secret = 取得したクライアントシークレット;

$sig = generate_sig(https://api.instagram.com/v1/users/相手のユーザーID/relationship, $params, $secret);
echo $sig;
?>


で署名を取得。

Windowsのコマンドプロンプト上で、

lang:curl

codeC:\>curl -k -X POST -F 'access_token=取得したアクセストークン' -F 'action=follow' -F 'sig=生成した署名' https://api.instagram.com/v1/users/相手のユーザーID/relationship



と入力したところ、

lang:curl

{"meta":{"error_type":"OAuthParameterException","code":400,"error_message":"Missing access_token URL parameter."}}



と出力されてしまいます。

引き続き、何か原因等お気づきの点がありましたら、コメントいただけるとありがたいです。