リンクをカードにするプラグインを作ろう!(6)文字コードを変換する

上手くタイトルと概要文が取れないサイトの対応をします。

前回まで

OGPが設定されていないサイトのタイトルと概要文を取得しました。

[link url=”https://popozure.info/20180817/13271″]

UTF-8以外の文字コードのサイト

文字コードがUTF-8以外の場合、正しく文字を扱うことが出来ず、タイトルや概要文が取得できません。

UTF-8に文字コードを変換すると上手く扱うことが出来ます。

文字コードがEUC-JPのサイト

←サイト名称
←タイトル
https://www.4gamer.net/ ←URL
←概要文

文字コードがシフトJISのサイト

←サイト名称
←タイトル
https://nttxstore.jp/ ←URL
←概要文

コードを書いていく

文字コードを変換する

cURLで取得した$htmlの文字コードをUTF-8に変換します。

[php title=”popo-blogcard.php” start-line=”26″ mark=”6″] if (curl_errno($ch ) ) {
$site_name = ”;
$title = $url;
$excerpt = ”;
} else {
$html = mb_convert_encoding($html, ‘UTF-8’, ‘ASCII,JIS,UTF-8,EUC-JP,SJIS’ );
if (preg_match(‘/property=”og:title”\s*content=”([^”]*)/si’, $html, $m ) ) {
$title = esc_html($m[1]);
} else {
if (preg_match(‘/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
}[/php]

タイトルと概要文が取得できた

もう一度試してみます。

文字コードがEUC-JPのサイト

www.4gamer.net ←サイト名称
4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで! ←タイトル
https://www.4gamer.net/ ←URL
ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください! ←概要文

文字コードがシフトJISのサイト

nttxstore.jp ←サイト名称
NTTグループの安心オンラインストア – NTT-X Store ←タイトル
https://nttxstore.jp/ ←URL
NTTグループが運営する安心・安全の通販ショップNTT-X Store。パソコン、液晶ディスプレイ、デジカメ、デジタル機器、ネットワークカメラ、家電などを激安価格と即納で通信販売!送料無料やクーポンなどお得な商品を多数掲載中です。 ←概要文

今回のコード

今回はここまでです。

[php title=”popo-blogcard.php”]]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
} else {
if (preg_match(‘/name=”description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:site_name”\s*content=”([^”]*)/si’, $html, $m ) ) {
$site_name = esc_html($m[1]);
} else {
$m = parse_url($url );
$site_name = $m[‘host’];
}
}
curl_close($ch );
$html = ‘

‘.$site_name.’
‘.$title.’
‘.$url.’
‘.$excerpt.’
‘;
return $html;
}
}
$popo_blogcard = new popo_blogcard;[/php]

次回は・・・

スタイルシートを設定してブログカードっぽい見た目にしようと思います。

[link url=”https://popozure.info/20180819/13307″]

では、この辺で。(^-^)o

[amzn-link asin=”4774187062″][amzn-link asin=”B00M939Y0I”][amzn-link asin=”4798143774″][amzn-link asin=”477414164X”][amzn-link asin=”B079VVPN46″]

EasyBotterで日本語の人だけフォローする

Twitterのbot作成によく使われるEasyBotterをカスタマイズしてみます。

phpでTwitter botが作れるEasyBotter

pha氏が作成・公開しているEasyBotterをカスタマイズしてみます。

[link url=”http://pha22.net/twitterbot/”]

日本語の人だけフォローする

autoFollow()をオンにしておくと、フォローしてくれた人を自動でフォローバックしてくれて便利なのですが、異国の方々が一気に増えることがあります。

そこでプロフィールに日本語がある人だけをフォローするカスタマイズを行いました。

まずは autoFollow() を書き換える

こんな感じに差し替えます。

[php title=”EasyBotter.php” start-line=”227″ mark=”4-30″] return $results;
}

//自動フォロー返しする(プロフィールに日本語がある人だけ)
function autoFollow(){
$followers = $this->getFollowers();
$friends = $this->getFriends();
$followlist = array_diff($followers[“ids”], $friends[“ids”]);
if($followlist){
$j =0;
for ($i = 0; $i < count($followlist); $i++ ) { $j++; $user_list[] = $followlist[$i]; if ($j >= 100 or $i == count($followlist)) {
$profiles = $this->getProfiles($user_list);
foreach ($profiles as $user) {
$text = $user[‘name’] . $user[‘description’] . $user[‘status’][‘text’];
if (preg_match(‘/[ぁ-んァ-ヶ]/u’, $text)) {
$response = $this->followUser($user[‘id’]);
if(empty($response[“errors”])){
echo $response[“name”].”(@“.$response[“screen_name”].”)をフォローしました”;
}
}
}
$j = 0;
unset($user_list);
}
}
}
}

//============================================================
//上の5つの関数から呼び出す関数
//============================================================[/php]

未フォロワーリストから100件ずつプロフィールを読み込んで、「ひらがな」か「カタカナ」がある場合のみフォローしに行っています。

100件ずつなのはAPIの制限です。

プロフィールを取得する関数を作成する

こんな感じで getFollowers() の下辺りに追加します。

[php title=”EasyBotter.php” start-line=”570″ mark=”10-22″] function getFollowers()
{
$url = “https://api.twitter.com/1.1/followers/ids.json”;
$response = $this->_getData($url);
if($response[“errors”]){
echo $response[“errors”][0][“message”];
}
return $response;
}
function getProfiles($user_id = NULL)
{
$url = “https://api.twitter.com/1.1/users/lookup.json?”;
if ($user_id) {
$url .= ‘user_id=’ . implode(‘,’,$user_id) .”&”;
}
$url .= “include_entities=true”;
$response = $this->_getData($url);
if(isset($response[“errors”])){
echo $response[“errors”][0][“message”];
}
return $response;
}

function checkApi($resources = “statuses”){
$url = “https://api.twitter.com/1.1/application/rate_limit_status.json”;
if ($resources) {
$url .= ‘?resources=’ . $resources;
}[/php]

完成

これでプロフィールに日本語がある人だけをフォローするようになりました。

日本語といっても漢字だけの人は中国の方と判断が難しいので「ひらがな」か「カタカナ」が1文字でも含まれている人です。

記号としてひらがなを使っている異国の方はフォロー返しをしてしまいます。

言語設定が日本語の人だけフォローする

しばらくしてから気づきましたが、言語設定が「日本語」の人という条件にすれば良い気がしてきました。

こんな感じになります。

[php title=”EasyBotter.php” start-line=”230″ mark=”1,14″] //自動フォロー返しする(日本語設定の人だけ)
function autoFollow(){
$followers = $this->getFollowers();
$friends = $this->getFriends();
$followlist = array_diff($followers[“ids”], $friends[“ids”]);
if($followlist){
$j =0;
for ($i = 0; $i < count($followlist); $i++ ) { $j++; $user_list[] = $followlist[$i]; if ($j >= 100 or $i == count($followlist)) {
$profiles = $this->getProfiles($user_list);
foreach ($profiles as $user) {
if ($user[‘lang’] == ‘ja’) {
$response = $this->followUser($user[‘id’]);
if(empty($response[“errors”])){
echo $response[“name”].”(@“.$response[“screen_name”].”)をフォローしました”;
}
}
}
$j = 0;
unset($user_list);
}
}
}
}[/php]

この方がすっきりして良いですね。

誰でもやりたそうなカスタマイズなのに全然情報が無かったですね。

では、この辺で。(^-^)o

リンクをカードにするプラグインを作ろう!(5)metaタグを取得する

引き続きリンク先のタイトルと概要文を取得します。

前回まで

リンク先から取得したHTMLを見て、OGPの情報を取得しました。

[link url=”https://popozure.info/20180812/13260″]

OGPが設定されていないサイト

OGPが設定されているサイトは上手くタイトルと概要文が取得できましたが、facebookでのシェアを意識していないサイトはOGP情報が設定されていません。

←サイト名称
←タイトル
http://www.metro.tokyo.jp/ ←URL
←概要文

titleタグとmetaタグのdescriptionを設定しているサイトは多いので、そっちを取得してみます。

コードを書いていく

titleを取得する

OGPのタイトルが取得できなかった場合、titleタグに書かれた文字を取得します。

[php title=”popo-blogcard.php” start-line=”31″ mark=”3-6″] if (preg_match(‘/property=”og:title”\s*content=”([^”]*)/si’, $html, $m ) ) {
$title = esc_html($m[1]);
} else {
if (preg_match(‘/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
}
if (preg_match(‘/property=”og:site_name”\s*content=”([^”]*)/si’, $html, $m ) ) {
$site_name = esc_html($m[1]);
}[/php]

descriptionを取得する

OGPの概要文が取得できなかった場合、metaタグのdescriptionに書かれた文字を取得します。

[php title=”popo-blogcard.php” start-line=”31″ mark=”10-13″] if (preg_match(‘/property=”og:title”\s*content=”([^”]*)/si’, $html, $m ) ) {
$title = esc_html($m[1]);
} else {
if (preg_match(‘/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
} else {
if (preg_match(‘/name=”description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:site_name”\s*content=”([^”]*)/si’, $html, $m ) ) {
$site_name = esc_html($m[1]);
}[/php]

ドメイン名を取得する

OGPのサイト名称が取得できなかった場合、URLからドメイン名を取得します。

[php title=”popo-blogcard.php” start-line=”31″ mark=”17-19″] if (preg_match(‘/property=”og:title”\s*content=”([^”]*)/si’, $html, $m ) ) {
$title = esc_html($m[1]);
} else {
if (preg_match(‘/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
} else {
if (preg_match(‘/name=”description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:site_name”\s*content=”([^”]*)/si’, $html, $m ) ) {
$site_name = esc_html($m[1]);
} else {
$m = parse_url($url );
$site_name = $m[‘host’];
}[/php]

タイトルと概要文が取得できた

もう一度試してみます。

www.metro.tokyo.jp ←サイト名称
東京都公式ホームページ ←タイトル
http://www.metro.tokyo.jp/ ←URL
東京都庁の公式ホームページ。都政に関する最新情報、記者会見、都議会や各局の情報、統計、入札・契約情報、知事への提言など。 ←概要文

OGPが設定されていないサイトでもタイトルと概要文を取得することができました。

今回のコード

今回はここまでです。

[php title=”popo-blogcard.php”]]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
} else {
if (preg_match(‘/name=”description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
}
}
if (preg_match(‘/property=”og:site_name”\s*content=”([^”]*)/si’, $html, $m ) ) {
$site_name = esc_html($m[1]);
} else {
$m = parse_url($url );
$site_name = $m[‘host’];
}
}
curl_close($ch );
$html = ‘

‘.$site_name.’
‘.$title.’
‘.$url.’
‘.$excerpt.’
‘;
return $html;
}
}
$popo_blogcard = new popo_blogcard;[/php]

次回は・・・

UTF-8以外の文字コードに対応しようと思います。

[link url=”https://popozure.info/20180818/13278″]

では、この辺で。(^-^)o

[amzn-link asin=”4774187062″][amzn-link asin=”B00M939Y0I”][amzn-link asin=”4798143774″][amzn-link asin=”B075S15Y3S”][amzn-link asin=”B079Q31VLZ”]

[Pz-LkC][2.1.7]リンクをカード形式で表示するプラグイン更新。外部リンクのみ変換など。

リンクをカード形式で表示するWordPressプラグイン「Pz-LinkCard」。

最新版ver2.1.7を公式プラグインディレクトリで公開する予定しました。

ver2.1.6→ver2.1.7修正点

2018年8月9日に公開したver2.1.6からのバージョンアップです。

[link url=”https://popozure.info/20180809/13213″]

警告エラーを修正しました

Notice(警告エラー)が出ていたのを修正しました。(ver2.1.6.1修正分)

アンダーラインが表示されてしまうのを修正しました

設定変更するとアンカー文字にアンダーラインが表示されてしまうのを修正しました。(Ver2.1.6.2修正分)

サイト判定の方法を修正しました

外部サイト・内部サイト・同一ページの判断方法を修正しました。

外部サイトのみ変換を追加しました

設定画面に「外部リンクのみ変換」の項目を追加しました。

この設定項目にチェックを入れると「テキストリンク行の変換」および「URL行の変換」が外部リンクに対してのみ機能するようになります。

文字コードの取得方法を修正しました

PHPに文字コードを判断させたとき、キャッシュに記録する文字コードの種別を修正しました。

ver2.1.7→ver2.1.7.1修正点

かんたん書式設定の追加

「かんたん書式設定」に「見出し」を追加しました。

その他

お気づきの点などありましたら、コメント欄や、ツイッターアカウント「ぽぽろん@ぽぽづれ。(@popo68k)」もしくは「ぽぽづれ。(@popozure)」までご報告ください。

では、この辺で。(^-^)o

リンクをカードにするプラグインを作ろう!(4)OGP情報を取得する

取得したHTMLからリンク先のタイトルと概要文を抜粋します。

前回まで

リンク先サイトからHTMLを取得しました。

[link url=”https://popozure.info/20180811/13236″]

今回もコードを書いていく

OGPを取得する

metaタグからOGPの情報を取得します。

get_meta_tags()を使うと簡単そうですがget_meta_tags()はnameとcontentの組み合わせしか拾ってくれません。

OGPのmetaタグはpropertyとcontentなので正規表現で取りに行きます。

[php title=”popo-blogcard.php” start-line=”25″ mark=”6-15″] $html = curl_exec($ch);
if (curl_errno($ch ) ) {
$site_name = ”;
$title = $url;
$excerpt = ”;
} else {
if (preg_match(‘/property=”og:title”\s*content=”([^”]*)/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
if (preg_match(‘/property=”og:description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
}
if (preg_match(‘/property=”og:site_name”\s*content=”([^”]*)/si’, $html, $m ) ) {
$site_name = esc_html($m[1]);
}
}
curl_close($ch );
}[/php]

取得結果を表示する

とりあえず取得結果を返却してみましょう。

[php title=”popo-blogcard.php” start-line=”30″ mark=”13-14″] } else {
if (preg_match(‘/property=”og:title”\s*content=”([^”]*)/si’, $html, $m ) ) {
$title = esc_html($m[1]);
}
if (preg_match(‘/property=”og:description”\s*content=”([^”]*)/si’, $html, $m ) ) {
$excerpt = esc_html($m[1]);
}
if (preg_match(‘/property=”og:site_name”\s*content=”([^”]*)/si’, $html, $m ) ) {
$site_name = esc_html($m[1]);
}
}
curl_close($ch );
$html = ‘

‘.$site_name.’
‘.$title.’
‘.$url.’
‘.$excerpt.’
‘;
return $html;
}[/php]

確認してみる

記事中にショートコードを書いてみる

ちゃんと取得できているか確認してみましょう。

記事中に、

と書いてプレビューしてみましょう。

結果をプレビューで確認する

こんな感じで表示されたと思います。

ぽぽづれ。 ←サイト名称
リンクをカードにするプラグインを作ろう! ←タイトル
https://popozure.info/popo-blogcard-test ←URL
リンクをカード形式で表示させるWordPressプラグインを作成していきます。 ←概要文

ちゃんと取得できたみたいです。

今回のコード

今回はここまでです。

[php title=”popo-blogcard.php”]‘.$site_name.’

‘.$title.’
‘.$url.’
‘.$excerpt.’
‘;
return $html;
}
}
$popo_blogcard = new popo_blogcard;[/php]

次回は・・・

今回の取得方法で記事内容が取得できないサイトに対応しようと思います。

[link url=”https://popozure.info/20180817/13271″]

では、この辺で。(^-^)o

[amzn-link asin=”4774187062″][amzn-link asin=”B00M939Y0I”][amzn-link asin=”4798143774″][amzn-link asin=”4774189642″][amzn-link asin=”B075ZYQDRB”]