@Blog{zip358.com}
日常日誌からプログラムやYOUTUBER紹介、旅日記まで日々更新中です。
【#はてな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
※この記事は著者が40代前半に書いたものです.
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,
ブルータス、お前もか?古代の暗号シーザー。 #phpcode
2023.04.30
おはようございます。古代にも暗号というものがあったらしい。古代の人が使っていたシーザーという暗号をPHP化しました。demo74のページを見ると実行結果が表示されていると思います。
古代にはPCというものが無かったので、これでも解読するのにある程度、時間がかかったんでしょうね。ぱっと見、暗号化されているのは分かるけど瞬時に解読できる人はあまりいなかっただと思います。近年では量子暗号とか、パッと見どころかPCがあっても鍵が無いと解読に途方も無い時間を費やする暗号までありますよね。そう思うと暗号の歴史を辿るのも面白いかもしれないですね。
<?php
function caesarCipher($str, $shift) {
$result = "";
$len = strlen($str);
// 26文字のアルファベットを配列として定義する
$alpha = range('a', 'z');
for ($i = 0; $i < $len; $i++) {
$char = strtolower($str[$i]); // 大文字を小文字に変換する
if (in_array($char, $alpha)) { // アルファベットの場合のみシフトする
$index = array_search($char, $alpha); // アルファベットの位置を検索する
$newIndex = ($index + $shift) % 26; // シフト後のアルファベットの位置を計算する
$result .= $alpha[$newIndex]; // シフト後のアルファベットを結果に追加する
} else {
$result .= $char; // アルファベット以外はそのまま結果に追加する
}
}
return $result;
}
// 使用例
$plaintext = "hello world";
$ciphertext = caesarCipher($plaintext, 3);
echo $ciphertext; // "khoor zruog"
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$alpha, $ciphertext, $len, $newIndex, $plaintext, $shift, caesarCipher, char, echo, else, lt, quot, range, result, return, STR, strlen, シーザー, 小文字, 解読,
WordPress自動日本語タグを吐き出しプラグインを作りました。
2018.11.17
WordPress自動日本語タグを吐き出しプラグインを作りました。
あのjapanese autotagというプラグインと考え方は同じですが、
自分が作ったものはその簡略化したものです。
ソースコードは全ったく違う感じですが、動作は似たような感じです。
機能はjapanese autotagよりかは少ないですが、これだけで十分かなと思います。
ダウンロードはこちらから
https://zip358.com/tool/jp-auto-tag.zip [v2に対応済み]
尚、Yahoo デベロッパーのアプリケーションIDが必要となります。
ソースコードは下記になります。※v1のソースコードなので今は動きません!!最新の記事を参照ください。
<?php
/*
Plugin Name: jp-auto-tag
Version: 0.1.11
Description: auto jp tag
Author: taoka toshiaki
Author URI: https://zip358.com/
Plugin URI: https://wordpress.org/extend/plugins/jp-auto-tag/
*/
class jp_auto_tag{
public $db_option = "jp_auto_tag";
//api
public $results = "ma";
public $filter = array("1","2","3","4","5","6","7","8","9","10","11","12","13");
function frm_page(){
add_menu_page('jp-auto-tag','jp-auto-tag', 'manage_options', __FILE__, array($this,'show_text_option_page'), '',8);
}
function show_text_option_page(){
wp_enqueue_style( 'bootstrap', 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css', array(), '3.3.6' );
wp_enqueue_script( 'bootstrap', 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js', array(), '3.3.6');
$options = get_option($this->db_option);
if(!empty($options)){
$appid = $options["appid"];
foreach ($this->filter as $key => $value) {
if($options["filter".$value] == $value){
$f[] = "checked";
}else{
$f[] = "";
}
}
}
include_once dirname( __FILE__ ).'/jp-auto-tag-tmp.php';
}
function ajax_event(){
$appid = $_POST["appid"];
$filter =$_POST["filter"];
$options["appid"] = $appid;
foreach ($this->filter as $key => $value) {
if(in_array($value,$filter,true)){
$options["filter".$value] = $value;
}else{
$options["filter".$value] = "";
}
}
update_option($this->db_option, $options);
$obj["appid"] = $appid;
$obj["filter"] = $filter;
print json_encode($obj);
die(0);
}
function api_tag($post_id){
ini_set("display_errors",1);
$post = get_post($post_id);
$title = $post->post_title;
$content = strip_tags($post->post_content);
$sentence = $title.$content;
if(strlen($sentence)>102400){
$sentence = substr($sentence,0,102400);
}
$options = get_option($this->db_option);
if(!empty($options)){
$appid = $options["appid"];
foreach ($this->filter as $key => $value) {
if($options["filter".$value] == $value){
$f[] = $value;
}
}
}
if($appid){
$filter = implode("|",$f);
if(!$filter){
$url = "https://jlp.yahooapis.jp/MAService/V1/parse?appid=$appid&results=$this->results&sentence=".urlencode($sentence);
}else{
$url = "https://jlp.yahooapis.jp/MAService/V1/parse?appid=$appid&results=$this->results&ma_filter=$filter&sentence=".urlencode($sentence);
}
$xml = @file_get_contents($url);
$xml_obj = simplexml_load_string($xml);
if($xml_obj->ma_result->word_list){
foreach($xml_obj->ma_result->word_list->word as $word) {
if($word->surface){
$tags[] = $word->surface;
}
if(is_array($tags)){
wp_set_post_tags($post_id, implode(",",array_unique($tags)), false);
}
}
}
}
}
}
$jp_auto_tag = new jp_auto_tag();
add_action('save_post',array($jp_auto_tag,'api_tag'));
add_action('publish_post',array($jp_auto_tag,'api_tag'));
add_action('admin_menu', array($jp_auto_tag, 'frm_page'));
add_action('wp_ajax_ajax_event',array($jp_auto_tag,'ajax_event'));
<form id="ajax-frm">
<table class="table">
<tr>
<td>
アプリケーションID
</td>
<td>
<input type="text" name="appid" value="<?=$appid?>" class="form-control">
</td>
</tr>
<tr>
<td>
解析結果として出力する品詞
</td>
<td>
<input type="checkbox" name="filter[]" value="1" <?=$f[0]?> class="form-control">1 : 形容詞
<input type="checkbox" name="filter[]" value="2" <?=$f[1]?> class="form-control">2 : 形容動詞
<input type="checkbox" name="filter[]" value="3" <?=$f[2]?> class="form-control">3 : 感動詞
<input type="checkbox" name="filter[]" value="4" <?=$f[3]?> class="form-control">4 : 副詞
<input type="checkbox" name="filter[]" value="5" <?=$f[4]?> class="form-control">5 : 連体詞
<input type="checkbox" name="filter[]" value="6" <?=$f[5]?> class="form-control">6 : 接続詞
<input type="checkbox" name="filter[]" value="7" <?=$f[6]?> class="form-control">7 : 接頭辞
<input type="checkbox" name="filter[]" value="8" <?=$f[7]?> class="form-control">8 : 接尾辞
<input type="checkbox" name="filter[]" value="9" <?=$f[8]?> class="form-control">9 : 名詞
<input type="checkbox" name="filter[]" value="10"<?=$f[9]?> class="form-control">10 : 動詞
<input type="checkbox" name="filter[]" value="11"<?=$f[10]?> class="form-control">11 : 助詞
<input type="checkbox" name="filter[]" value="12"<?=$f[11]?> class="form-control">12 : 助動詞
<input type="checkbox" name="filter[]" value="13"<?=$f[12]?> class="form-control">13 : 特殊(句読点、カッコ、記号など)
</td>
</tr>
<tr>
<td colspan="2"><input type="button" id="frmsubmit" value="登録する" class="form-control"></td>
</tr>
</table>
</form>
<script>
jQuery(function($){
$("#frmsubmit").on("click",function(){
var ajaxurl = '<?=admin_url( 'admin-ajax.php');?>';
var data = $("#ajax-frm").serializeArray();
data.push({name:"action",value:"ajax_event"});
$.ajax({
type:'POST',
url:ajaxurl,
data:data,
success:function(obj){
console.log(obj);
if(obj.appid!==""){
alert("更新しました");
}
}
});
});
})
</script>
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
API, appid, array, Bootstrap, dirname, extend, foreach, implode, MAService, obj, parse, plugins, strlen, success, 助動詞, 品詞, 形容動詞, 接尾辞, 接頭辞, 連体詞,
(´ι _` )アッそうなんだそうなんだPHP fileメソッド
2015.11.09
PHPのfileメソッドっていうのが便利です。
ファイルを配列として引っこ抜いてくれる。こんな関数便利だなと
おそらく他の言語でも常識的にある関数なんだろうけど
自分はあまり知らなかったので便利だなと。
もうひとつ便利な関数は配列の中に空の値があったりすると
その配列を削除してくれるarray_filterとかいうものです。
これは便利・・・何故かってPHP、配列の中が空でも
値があるよって判断するです。そういう時に少し便利です。
emptyは使えないので・・・。もし配列が空でも必要な場合は
strlenとかでバイト数を数えるなどで対応するしか無いですね。
そういう事でメモがてらに残しときます。
$hoge = file("hoge.txt"); for($i=0;$i<sizeof($hoge);$i++){ echo hoge[$i]."<br>\n"; } print($hoge); $hoge2 = array_filter($hoge); print($hoge2);
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
0, 2, array, br, echo, empty, file, filter, For, gt, hoge, lt, php, print, sizeof, strlen, txt, アッ, これ, バイド, ファイル, メソッド, メモ, もうひとつ, もの, 中, 事, 他, 便利, 値, 判断, 削除, 場合, 対応, 少し, 必要, 時, 空, 自分, 言語, 配列, 関数,