![](https://zip358.com/wp-content/uploads/2024/06/php2024-1.png)
【#はてなAPI認証】【#不完全なコード】このコードは機能しません.
2024.07.03
おはようございます.久々にAPI認証で躓いています.この頃は躓いたことがなかったのですがはてなAPI認証で躓いております.エラー内容があまりにもアバウト過ぎて何処の項目でエラーになっているのかがわからない感じです.分かった方はコメント欄にコメント頂けたらと思っています.宜しくお願い致します.
oauthSignatureを作っているところでコケているぽっいと思っているのですが、それが正しいのかどうかも定かではないです.近日中にcurlから参考にしているような方法に変えてみようと思っています.
参考にしたサイトはQiitaの質問に記載していますので良かったら覗いてみてください.
<?php
ini_set('display_errors', 1);
require '../config/config.php';
class hatena
{
public $oauthCallback = OAUTH_CALLBACK;
public $oauthConsumerKey = OAUTH_CONSUMER_KEY;
public $oauthConsumeSecret = OAUTH_CONSUMER_SECRET;
public $oauthNonce = '';
public $oauthSignature = null;
public $oauthSignatureMethod = "HMAC-SHA1";
public $oauthTimestamp = '';
public $oauthVersion = "1.0";
public $contentType = 'application/x-www-form-urlencoded';
public $oauthParameters = [];
public function oauthInitiate()
{
$url = 'https://www.hatena.com/oauth/initiate';
$this->oauthNonce = uniqid();
$this->oauthTimestamp = time();
$this->oauthParameters = [
'oauth_consumer_key' => rawurlencode($this->oauthConsumerKey),
'oauth_nonce' => rawurlencode($this->oauthNonce),
'oauth_signature_method' => rawurlencode($this->oauthSignatureMethod),
'oauth_timestamp' => rawurlencode($this->oauthTimestamp),
];
$params = [
'scope' => 'read_public,write_public,read_private,write_private'
];
$this->getSignature($url, 'POST', $params);
$this->oauthParameters['oauth_signature'] = rawurlencode($this->oauthSignature);
$ch = curl_init($url);
$headers = [ //'.$this->oauthParameters['realm'].'
'Authorization: OAuth realm="",oauth_callback="' . rawurlencode($this->oauthCallback) . '",oauth_consumer_key="' . $this->oauthParameters['oauth_consumer_key'] . '",oauth_nonce="' . $this->oauthParameters['oauth_nonce'] . '",oauth_signature="' . $this->oauthParameters['oauth_signature'] . '",oauth_signature_method="' . $this->oauthParameters['oauth_signature_method'] . '",oauth_timestamp="' . $this->oauthParameters['oauth_timestamp'] . '",oauth_version="1.0"',
'Content-Type: ' . $this->contentType,
'Content-Length: ' . (string)strlen($this->contentType)
];
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
if (curl_error($ch)) {
echo 'Curl error: ' . curl_error($ch);
}
parse_str($response, $response_params);
var_dump($response_params);
curl_close($ch);
return $this;
}
public function getSignature($url, $method = 'POST', $params = [], $oauthTokenSecret = '')
{
foreach($params as $key=>$value){
$params[$key] = rawurlencode($value);
}
$hasBase = http_build_query($this->oauthsort(array_merge($this->oauthParameters, $params)), '', '&', PHP_QUERY_RFC3986);
$signingKey = implode('&', [rawurlencode($this->oauthConsumeSecret), rawurlencode($oauthTokenSecret)]);
$baseString = implode('&', [
rawurlencode($method),
rawurlencode($url),
$hasBase,
]);
$signature = hash_hmac('sha1', $baseString, $signingKey, true);
$signature = base64_encode($signature);
$this->oauthSignature = $signature;
return $this;
}
//OAuth式 パラメータのソート関数
public function oauthsort($a)
{
$b = array_map(null, array_keys($a), $a);
usort($b, ['hatena', 'oauthcmp']);
$c = array();
foreach ($b as $v) {
$c[$v[0]] = $v[1];
}
return $c;
}
public function oauthcmp($a, $b)
{
return strcmp($a[0], $b[0])
? strcmp(rawurlencode($a[0]), rawurlencode($b[0]))
: strcmp(rawurlencode($a[1]), rawurlencode($b[1]));
}
}
(new hatena)->oauthInitiate();
こちらでも解決策を模索してみます.解決出来れば追記したいと思っています.
追記::解決出来ました.
明日へ続く.
著者名
@taoka_toshiaki
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
application, Authorization, Content-Length, contentType, curl, foreach, getSignature, implode, oauthConsumerKey, oauthConsumeSecret, oauthParameters, oauthSignature, oauthSignatureMethod, oauthsort, oauthTimestamp, Qitta, rawurlencode, string, strlen, uniqid,
![](https://zip358.com/wp-content/uploads/2021/05/phpLanguage.png)
PHP言語でthreads投稿するための雛形を作りました.
2024.06.22
おはようございます、threads-Apiで投稿するための雛形を作りました(たぶんPHP言語では国内最速公開かも).使用したい方は下記のリンクを参照してご使用いただけたら幸いです.Threadsのバージョンが上がれば使用出来なくなる可能性がありますので、ご注意ください.
https://github.com/taoka3/threads-api
![](https://zip358.com/wp-content/uploads/2024/06/image-4.png)
Qiitaにも同じ内容のものを記載しています、この頃API関連しか記載しなくなったんだけど何か違う内容で仕事に影響ない範囲の技術共有っていうのは難しいなって思います.今回のAPIソースコードも自動投稿が出来るようになるプログラムコードなので売り物にしようと思えば出来るコードです.
Qiitaの技術共有って難しいなって思います.機械学習の情報も結構オープンソースで出ているわけで、そう思うと対した共有でもないかもなって思います.人によって価値が変わるのではないかなって思うこの頃です、悩ましい😌.
明日へ続く.
著者名
@taoka_toshiaki
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
APIソースコード, PHP言語, Qitta, threads, threads-Api, オープンソース, この頃API関連, バージョン, プログラムコード, リンク, 下記, 価値, 共有, 国内最速公開, 売り物, 影響ない範囲, 技術共有, 機械学習, 自動投稿, 雛形,