Yahoo!みたいな検索ボタンを付けてみた.挙動が若干不審気味かもしれない.
2024.11.03
おはようございます.Yahoo!みたいな検索ボタンを付けてみた.挙動が若干不審ですが先日の早朝にリリースしました.先日の記事にも書いたのですがいろいろと機能を追加しているのでなんだか、サイトがごちゃごちゃしてきている気がします.当初はシンプルベストにしたいなと思っていたのですが、まるで注文の多い料理店の様.
ソースコードは汎用性のあるコードにしたつもりなので、環境がワードプレスなら動作すると思います.ソースコードはこちら.因みに変数の命名は自分サイトの命名規則に従っていますので、ご自身のサイトにあった命名規則に変更してください.
const zbody = document.body;
let zsearchButton = null;
zbody.addEventListener('mouseup', handleSelectionPc);
function handleSelectionPc() {
const selection = window.getSelection();
const selectedText = selection.toString();
// 選択されたテキストが存在する場合
if (selectedText) {
// 選択範囲の矩形を取得
const range = selection.getRangeAt(0);
const rect = range.getBoundingClientRect();
// 検索ボタンを作成
if (!zsearchButton) {
zsearchButton = document.createElement('button');
zsearchButton.textContent = '検索';
zsearchButton.classList.add('search-button', 'btn', 'btn-dark');
// ボタンをbodyにappendChildし、位置を調整
document.body.appendChild(zsearchButton);
zsearchButton.style.position = 'absolute';
zsearchButton.style.top = `${rect.top + window.scrollY + 30}px`;
zsearchButton.style.left = `${rect.left + window.scrollX}px`;
}
// クリックイベントリスナーを追加
zsearchButton.addEventListener('click', () => {
search(selectedText);
removeButton();
});
} else {
// 検索ボタンを削除
removeButton();
}
}
zbody.addEventListener('touchend', handleSelectionSp);
function handleSelectionSp() {
const selection = window.getSelection();
const range = selection.getRangeAt(0);
const rect = range.getBoundingClientRect();
const selectedText = selection.toString();
if (selectedText) {
if (!zsearchButton) {
zsearchButton = document.createElement('button');
zsearchButton.textContent = '検索';
zsearchButton.classList.add('search-button', 'btn', 'btn-dark');
document.body.appendChild(zsearchButton);
zsearchButton.style.position = 'absolute';
zsearchButton.style.top = `${window.scrollY + rect.top + 30}px`;
zsearchButton.style.left = `${rect.left}px`;
}
zsearchButton.addEventListener('click', () => {
search(selectedText);
removeButton();
});
} else {
removeButton();
}
}
function removeButton() {
if (zsearchButton) {
zsearchButton.remove();
zsearchButton = null;
return removeButton();
}
}
function search(keyword) {
window.location.href = '://' + window.location.host + '/?s=' + encodeURI(keyword);
}
明日へ続く
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
body, createElement, else, encodeURI, getRangeAt, getSelection, handleSelectionPc, handleSelectionSp, keyword, null, px, removeButton, search, selectedText, window.scrollX, window.scrollY, zsearchButton, zsearchButton.classList.add, クリックイベントリスナー, 矩形,
x.comのAPI(FREE)にて自分のユーザー情報を取得するには
2024.06.05
おはようございます.x.comのAPI(FREE)にて自分のユーザー情報を取得するにはってググってもv1.1の情報だらけだったので情報を記載します.v2対応です.一部、有料でないと取得できない部分があり返却もエラーで返ってきますが、雛形コードを記載します.
注意事項
TwitterOAuthというComposerライブラリを使用しています.
APIなどの値はご自身のAPIに合わしてください.
参考にしたサイト
https://developer.x.com/en/docs/twitter-api/users/lookup/api-reference/get-users-me
<?php
date_default_timezone_set('Asia/Tokyo');
require_once "../vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
class xMyProfile
{
public $connection = null;
public $response = null;
public function __construct()
{
$this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
$this->connection->setApiVersion("2");
$this->response = $this->connection->get('users/me', [
'expansions'=>'pinned_tweet_id',
'tweet.fields'=>implode(',',[
'attachments',
'author_id',
'context_annotations',
'conversation_id',
'created_at',
'edit_controls',
'entities',
'geo',
'id',
'in_reply_to_user_id',
'lang',
'non_public_metrics',
'public_metrics',
'organic_metrics',
'promoted_metrics',
'possibly_sensitive',
'referenced_tweets',
'reply_settings',
'source',
'text',
'withheld'
]),
'user.fields' => implode(',', [
'created_at',
'description',
'entities',
'id',
'location',
'most_recent_tweet_id',
'name',
'pinned_tweet_id',
'profile_image_url',
'protected',
'public_metrics',
'url',
'username',
'verified',
'verified_type',
'withheld'
])
]);
return $this;
}
/**
* プロフィール情報全てを取得
*/
public function getMyProfile()
{
return $this->response;
}
/**
* プロフィールアイコンURLを取得
*/
public function getIconUrl()
{
return $this->response->data->profile_image_url;
}
}
var_dump((new xMyProfile)->getMyProfile());
//print (new xMyProfile)->getIconUrl();
この記事はQiitaに掲載していた記事になります.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
connection, construct, edit_controls, getIconUrl, getMyProfile, implode, lt, null, organic_metrics, print, promoted_metrics, public, qiita, quot, response, return, use AbrahamTwitterOAuthTwitterOAuth, users, vendor, X.com,
Nullセーフ演算子?->を提案
2024.04.21
おはようございます、PHP8からNullセーフ演算子というものが仲間に加わりました.Laravelでいうoptionalと同じ挙動になります.Laravelのoptionalを知らない方に説明をGeminiにしてもらいます.
$country = $object?->user?->getRule();
Nullセーフ演算子とは
・Nullセーフ演算子 ?-> を使用すると、オブジェクトがnullかどうかを事前にチェックすることなく、プロパティやメソッドにアクセスできます.・Nullセーフ演算子は、プロパティやメソッドだけでなく、配列や関数の呼び出しにも使用できる.
gemini
ということになり、とても便利な演算子です.使う機会はプログラムしていると結構あるので使用してみてはどうでしょうか?
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
country, gemini, getRule, gt, gt;user, Laravel, null, Nullセーフ演算子, object, optional, オブジェクト, プロパティ, メソッド, 事前, 仲間, 挙動, 演算子, 配列, 関数,
#久しぶりのコード`Xにポストするコード`
2023.11.17
おはよう御座います、さて正月休みは11日ぐらいあります、いやー正月休みはネトフリとゲームざんまいしてみたいと思っているのですが、結局どこかに出ていったりとかして目標達成できずにズルズルと休みを過ごすことになりそうです。👈前と言っていることが違いますね🙇。
さて、久しぶりにコードを書きました、この記事だけ見るとプログラマーじゃないかって思われるので最初に記載しときます。毎日のように仕事ではコードを書いています、仕事以外でコードを書いたのは一週間ぶりかなぁ。でも、このコードはポストでも書いている通り、特に難しいコードでもないのでオープンに公開しました。
このコードには必要ないコードが紛れているのはこのコードが使いましたコードだからです😂。
<?php
date_default_timezone_set('Asia/Tokyo');
ini_set("display_errors", 0);
require_once "../tw-config-v2.php";
require_once "../vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
class merukari{
public $connection = null;
public $pdo = null;
public function __construct()
{
$this->connection = new TwitterOAuth(APIKEY, APISECRET,ACCESSTOKEN,ACCESSTOKENSECRET);
$this->connection->setApiVersion("2");
}
public function tweet($pattern)
{
$result = $this->connection->post("tweets", ["text" =>$pattern], true);
}
public static function pattern()
{
$pattern = [
'メルカリで参考書を取り扱ってます📖 どれも綺麗な状態です。#学び #python Cシャープ #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
'メルカリで参考書を出品してます📖 どれも綺麗な状態です。#学び #機械学習 #AI #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
'メルカリで参考書を売ってます📖 どれも綺麗な状態です。#学び #人工知能 #python #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
'メルカリで参考書を取り扱ってますよ📖 どれも綺麗な状態です。#学び #テック #企業 #学び #プログラム ⏭ https://jp.mercari.com/user/profile/808093563',
];
return $pattern[ (int)rand(0,(count($pattern)-1))];
}
}
try {
if($argv[1] === 'merukari'){
(new merukari())->tweet(merukari::pattern());
}
} catch (\Throwable $th) {
//throw $th;
}
もしかしたら、以前にもコードを公開して2回目になっていたりするかも知れません。そうだったらごめんなさい、無駄に記事を量産しています(反省。
そうそうXのハッシュタグ廃止は誤解だそうです。思い出したので書いときます、、、。
明日へ続く。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
argv, Asia, catch, connection, construct, int, lt, null, pattern, Python, quot, rand, return, throw, Throwable, true, try, Tweet, use AbrahamTwitterOAuthTwitterOAuth, vendor,
chatGPT3.5を先行的に使っている。
2023.09.21
おはようございます、chatGPT3.5を先行的に使っている。みんなが使えるわけではないようだけど、恐らくヘビーユーザーなのでアルファ版の先行に選ばれました。便利ですよねぇとは言わないけど困ったときに多少なりとも助けになることは間違いないです。
そうそうMysqlに複数の値を比較してある値を抽出するというメソッド?があることを最近知りました。簡単に言えば三項演算子みたいなものかなぁ・・・違うなぁ。ここらへんをchatGPT3.5に解説してもらいます。
COALESCE
関数は、SQLで複数の値を比較し、最初に NULL
以外の値が見つかった場合にそれを返す関数です。以下は COALESCE
関数の使用例です
SELECT COALESCE(列1, 列2, 列3, 列4) AS 選択された列
FROM テーブル名;
このクエリは、列1から列4までの値を比較し、最初に NULL
以外の値が見つかった場合にそれを 選択された列
として返します。
例えば、価格を比較して最初に NULL
以外の価格を選択するSQLクエリは次のようになります:
SELECT COALESCE(price1, price2) AS 選択された価格
FROM products;
このクエリは、products
テーブル内の各行に対して、price1
と price2
を比較し、最初に NULL
以外の価格を 選択された価格
として返します。
COALESCE
関数は、複数の値から最初の非 NULL
値を取得するために便利です。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
as, COALESCE, FROM products, MYSQL, null, price1, price2, products, SELECT COALESCE, SQL, SQLクエリ, アルファ版, クエリ, ヘビーユーザー, メソッド, 先行, 列, 列 FROM, 多少なり, 関数,
MastodonAPIに先週の日曜日に鞍替え。#脱TwitterAPI有料化
2023.02.10
おはようございます、TwitterAPIの有料化始まりましたね😖。
企業ではどういう対応を取るのでしょうか。個人で作っていたサービスはサービス閉鎖する人達が増えてきましたね。自分もBotで高知県の企業を応援するサービスを作っていたのだけど、2月5日にサービスを停止しました。
このブログは予約投稿なので、これが配信された時にはTwitterから具体的なAPIの値段などが発表されていると思います。その発表次第ですがBotを再稼働するという選択も残っているのですが、どうなるかは分からないです。
そんな中でPHP言語を使用しMastodonのAPIを使って「投稿だけ」する。コードを書きましたのでお裾分けです。
https://qiita.com/taoka-toshiaki/items/483340a28c03a1828400
php Mastodon.php 'テスト投稿です'
<?php
require "config.php";
class Mastodon{
const method = "POST";
const host = "mstdn.jp";
const endpoint = "/api/v1/statuses";
public static function toot($postdata = null)
{
if(!is_null($postdata)){
$data = http_build_query($postdata);
exec('curl -X POST -d "'.$data.'" --header "Authorization: Bearer '.ACCESSTOKEN.'" -sS https://'.self::host . self::endpoint.'; echo $?',$output);
var_dump($output);
}
}
}
// 「未収載」 -> 'unlisted'
// 「公開」 -> 'public'
// 「非公開」 -> 'private'
// 「ダイレクト」 -> 'direct'
if($argv[1]){
$postdata = [
"visibility"=>"public",
"status"=>strip_tags($argv[1]),
];
Mastodon::toot($postdata);
}
<?php
define('ACCESSTOKEN','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
ACCESSTOKEN, API, argv, Authorization, Bearer, BOT, echo, endpoint, exec, gt, header, lt, mastodon, null, php define, php require, quot, toot, Twitter, TwitterAPI,
Twitter-API-v2ツイート数珠繋ぎ #コード公開 #php
2022.10.04
おはようございます。土日祝も関係なくブログは毎日書いています🤮。
さて、今日はPHP言語でTwitterAPIバージョン2(v2)を使用してツイート数珠繋ぎをする方法を抜粋して記載していきます。こういうコードは今のところ出回っていないようです。少し調べれば公式サイトに記載しているのだけども・・・。まだ、日本語に対応した記事が少ないようです。v2でツイートする方法やリツイートする方法は何故かあるのだけどリプライ(Reply)[/statuses/update]する方法が記事としては記載していなかったので?記載します。
<?php
require_once "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
class tw{
var $connection = null;
function __construct()
{
$this->connection = new TwitterOAuth(APIKEY, APISECRET,ACCESSTOKEN, ACCESSTOKENSECRET);
$this->connection->setApiVersion("2");
}
function pickup_tweets(mixed $tw_text=null){
$obj = (object)[];
if(isset($tw_text) && is_array($tw_text)){
foreach ($tw_text as $key => $value) {
if(preg_replace("/[ | ]/","",$value)){
$obj = !$key?(
$this->connection->post("tweets", ["text" =>$value], true)
):
(
$this->connection->post("tweets", ["reply"=>["in_reply_to_tweet_id"=>$obj->data->id],"text"=> $value], true)
);
}
}
return true;
}
return false;
}
}
最初に結論とコードのアルゴリズムに付いて解説します。まず、tweetsのパラメーターでリプライ出来るように変更されています。v1.1とはそこが変わっているので同じ仕組みを検索しがちですがそれでは検索にヒットしないようです🤔。まずはエンドポイントの変更点の確認が必要みたい👏。
エンドポイントのv1.1からv2への対応表が公式から出ているので確認してみてください↑。
次にコードの解説ですがまずTwitterOAuthライブラリをインストールを行い、defineなどの設定なども考慮した上で実行してみてください(コードに追記記載が必要)。変数、$tw_textは配列です。また投稿する文字が入っていると考えてください。そしてこのコードを下記のような考え方で実行してみてください。
<?php
require_once "tw-index.php";
$tw_text[0] ="test1";
$tw_text[1] ="test2";
$tw = new tw();
if($tw->pickup_tweets($tw_text)){
$ret["msg"] = "ok";
}else{
$ret["msg"] = "NG";
}
var_dump($ret);
※前提条件としてtwitter社にAPIの申請を行って受理されている事。
これで思った通り実行出来たと思います。尚、自分のように管理画面などを作って数珠繋ぎの投稿するのも良いかも知れません🫠。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, Abraham, autoload, class, connection, function, lt, null, once, php, quot, Reply, require, statuses, tw, Twitter-API-v, TwitterAPI, TwitterOAuth, UPDATE, use, var, vendor, コード, サイト, ツイート, ところ, バージョン, ブログ, リツイート, リプライ, 今, 今日, 使用, 公式, 公開, 土日, 対応, 少し, 抜粋, 数珠繋ぎ, 方法, 日本語, 毎日, 祝, 言語, 記事, 記載,
1万件のCSVを読み込みテーブルに保存する雛形コード #PHPCode
2022.09.08
おはようございます、徐々に秋ぽっい日差しになってきましたね(まだ暑いけども😌)。
今日は、1万件のCSVを読み込みテーブルに保存する雛形コードを昨日、ちょちょっと書きましたので記載します。ファイルをダウンロードして使いたい方はGithubのリンクを下に貼っときますので、ご使用頂けたらと思います。尚、テーブルなどはCSVを参考にご自身で構えてください。
※動作環境はPHP8系です、なのでPHP7系では一部エラーが出ます。fgetcsv…nullを0へ変更。
Githubのリンクはこちら
Qiitaの方に記載しようかどうしようか、迷ったのですが第一弾目がアクセス数がそこそこ伸びたのでこれ以上、注目されるのは嫌なのでブログの方に記載しました。1万件のCSVを簡単に読み込ませる方法はPHPコードを書くのではなく、SQLのコマンドで実行した方が実は早いですけど・・・。
早いですけど、その場合、CSVがちゃんとしたファイルではないと上手くテーブルに保存されない場合や、そもそもコマンドラインで操作出来ない場合もあったりしてPHPコードなどで制御しないと駄目な事もあります。そんな時に、このコードをサンプルとして使って頂ければ良いなと思い作りました。
そんなにコードを書かなくてもまぁ動くんですよ。ちなみにソースコードには、あまりコメントを書いていないですが、プログラマーなら大体の人が理解できるレベルかと思います。
<?php
//ini_set("display_errors","On");
session_start();
require "db_config.php";
//読み込みCSVファイル名セット
class csv
{
/**
* @param string $filename
* @param int $cnt
* @return Object
*/
public function ini_csv($filename = "", $cnt = 0)
{
return new csv_read($filename, $cnt);
}
}
//CSVデータを読み込ます
class csv_read
{
var $max = 10000;
var $cnt = 0;
var $handle = null;
/**
* @param string $filename
* @param int $cnt
*/
public function __construct($filename = "", $cnt = 0)
{
$this->cnt = $cnt;
$this->handle = fopen($filename, "r");
$_SESSION["offset"] ? fseek($this->handle, $_SESSION["offset"]) : $this->handle;
}
/**
* @param int $header_skip
* @return Object
*/
public function reader($header_skip = 0)
{
if ($this->handle !== FALSE) {
$response = null;
$data = fgetcsv($this->handle, null, ",");
if (!$header_skip || $_SESSION["offset"]) {
if ($data !== FALSE) {
$_SESSION["offset"] = ftell($this->handle);
$response["data"] = $data;
$response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
$flag = true;
} else {
$_SESSION["offset"] = null;
$flag = false;
}
} else {
$_SESSION["offset"] = ftell($this->handle);
$response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
$flag = false;
}
} else {
$_SESSION["offset"] = null;
$flag = false;
}
return new table_save($flag, $response);
}
}
//tableにCSVデータを保存
class table_save
{
var $flag = false;
var $result = null;
/**
* @param boolean $flag
* @param array $response
* @return void
*/
public function __construct($flag, $response)
{
$this->flag = $flag;
$this->result = $response;
$this->column_name = "name,,...";
}
/**
* @param string $column_name
* @return void
*/
public function tbl_save($column_name = "")
{
if ($this->flag) {
$column = $column_name ? $column_name : $this->column_name;
$is_column = explode(",", $column);
foreach ($is_column as $key => $val) {
$is_value[$val] = $this->result["data"][$key];
}
try {
$pdo = new PDO(DSN, USERNAME, PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = (function ($is_column) {
$INSERTFIRST = null;
$INSERTLAST = null;
foreach ($is_column as $key => $val) {
$INSERTFIRST[] = "$val";
$INSERTLAST[] = ":$val";
}
$INSERTSQL = "(" . implode(",", $INSERTFIRST) . ")values(" . implode(",", $INSERTLAST) . ")";
$UPDATESQL = null;
foreach ($is_column as $key => $val) {
$UPDATESQL[] = "$val = :$val";
}
return "INSERT INTO " . TABLENAME . $INSERTSQL . " ON DUPLICATE KEY UPDATE " . implode(",", $UPDATESQL) . ";";
})($is_column);
$stmt = $pdo->prepare($sql);
foreach ($is_value as $key => &$value) {
$is_type = ($key === "test3" || $key === "test13") ? PDO::PARAM_INT : PDO::PARAM_STR;
$stmt->bindValue(":$key", $value, $is_type);
}
$this->result["sql"] = $stmt->execute();
} catch (\Throwable $th) {
//throw $th;
$this->result = null;
print $th->getMessage();
}
}
print json_encode($this->result);
}
}
//RUN...POST DATA
if (isset($_POST["csrf_token"]) && d_xss($_POST["csrf_token"]) === $_SESSION['csrf_token']) {
$_SESSION["offset"] = (int)d_xss($_POST["reset_flag"]) === 1 ? null : d_xss($_SESSION["offset"]);
$filename = d_xss($_POST["filename"]);
$cnt = (int)d_xss($_POST["cnt"]);
$column_name = "test1,test2,test3,test4,test5,test6,test7,test8,test9,test10,test11,test12,test13,test14,test15";
$header_skip = 1;
$csv = new csv();
$csv->ini_csv($filename, $cnt)->reader($header_skip)->tbl_save($column_name);
$csv = null;
} else {
print "";
}
function d_xss($data){
$data = strip_tags($data);
$data = htmlspecialchars($data,ENT_QUOTES);
return $data;
}
<?php
// ログインした状態と同等にするためセッションを開始します
session_start();
// 暗号学的的に安全なランダムなバイナリを生成し、それを16進数に変換することでASCII文字列に変換します
$toke_byte = openssl_random_pseudo_bytes(16);
$csrf_token = bin2hex($toke_byte);
// 生成したトークンをセッションに保存します
$_SESSION['csrf_token'] = $csrf_token;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="Description" content="Enter your description here"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<title>CSV</title>
</head>
<body>
<input type="hidden" name="csrf_token" value="<?=$csrf_token?>">
<span class="h3" id="cnt"></span><br><br>
<span class="h4" id="read_csv"></span><br><br>
<span class="h4" id="debug"></span><br><br>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
<script>
window.onload = function(){
read_csv(0,1);
};
function read_csv(cnt,reset_flag){
try{
$.ajax({
type: "post",
url: "./assets/php/class_csv.php",
async: false,
data: {csrf_token:document.getElementsByName("csrf_token")[0].value,reset_flag:reset_flag,filename:"dummy.csv",cnt:cnt},
dataType: "json",
success: function (response) {
if(response){
cnt = response.cnt;
document.getElementById("cnt").innerText = cnt;
if(response.data){
document.getElementById("read_csv").innerText = response.data[0] + response.sql;
document.getElementById("debug").innerText = cnt ===21?response.data:document.getElementById("debug").innerText;
}
setTimeout(function(){read_csv(cnt)},0);
}
}
});
}catch(e){
console.warn(e);
read_csv(cnt);
}
}
</script>
</body>
</html>
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
0, 1, 7, 8, CSV, fgetcsv, github, null, php, PHPCODE, qiita, SQL, アクセス, エラー, コード, こちら, コマンド, これ, ご使用, ご自身, ダウンロード, ちょ, テーブル, ファイル, ブログ, リンク, 一, 一部, 万, 下, 今日, 保存, 動作, 参考, 変更, 実行, 方, 方法, 日差し, 昨日, 有言実行, 注目, 環境, 秋, 簡単, 記載, 雛形,
さくらレンタルサーバーライト月額費用128円🤔
2022.08.26
おはようございます。昨日、さくらレンタルサーバーライトと契約しましたのでその経緯を記載したいと思います。
さくらレンタルサーバーライトと契約😶(一括払いの一年契約をしました)。一括払いなので135円128円(※135円記載ミスです。)ではなくてもう少し安くなっています。このさくらレンタルサーバーライトで作られたサイトでは主に機能制限がある中でどれぐらいの事が出来るのだろうかという腕試しみたいなものでレンタルしました。
因みにまだ何をしようかと考えている最中で、アイディアが浮かぶまで浮上待ちの状態です。ですので一年間放置とかあり得る話なので、気長に待っててください。
尚、このネタだけでは文字数があまり稼げないので昨日ツイートしたnohupことを記載します、この事については2019年に簡略的に紹介はしてあります。説明するとターミナル画面(Tera Term等)を閉じてもプロセスがキルされなくて動作するというリナックスのコマンドです。使い方はこんな感じです。
nohup 任意のコマンド > /dev/null &
このコマンドを使用する人は恐らく直ぐには終わらない処理を実行したい方や常時プロセスを立ち上げようと考えている方だと思います。常時プロセスを立ち上げたい場合は何らかの原因でプロセスが落ちた時の為にプロセス監視処理も記載しないといけないので注意が必要です。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
dev, gt, nohup, nohupこと, null, Tera Term, アイディア, コマンド, さくらレンタルサーバーライト, ターミナル画面, プロセス, プロセス監視処理, リナックス, 一括, 一括払い, 常時プロセス, 最中, 浮上, 経緯, 腕試し,
数珠繋ぎにTweet(リプライ)するPHP言語のコードは意外にも簡単。
2021.08.28
先日、高知県はコロナ感染症が111人になったそうです。早くコロナワクチン接種?2回目を打ちたいです、ただファイザー社のワクチンなのでデルタ株のウィルスは軽症化させるだけで無症状や感染しないようにはならないという事です。それでも重症化を防げるので打たないより打った方が良いですね?。なお、混合ワクチン接種が結構無敵だとか?インドではDNAワクチン接種を世界初で承認したみたいですね。新たな変異種も防ぐことが出来れば一気にDNAワクチン接種が世界的に進みそうです。
さて、前置きはここまでとして、数珠繋ぎにTweet(リプライ)するPHP言語のコードは意外にも簡単に書けました、なお、TwitterOAuthというライブラリを使用して呟いています。
作った経緯は数珠繋ぎにする方法などは調べてもヒットしなかったので記載しようと思ったわけです。今回の方法でアファリエイトなどを紹介などや長文のツイートが行えるなどいろいろな用途に使えるかと思います。
※このソースコードはコマンドライン(CUI)から叩かないと(実行)、動かない仕様になっています。
<?php
require_once("../vendor/autoload.php");
use Abraham\TwitterOAuth\TwitterOAuth;
if ($argv[0]) {
require_once "./tw-config.php";
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
date_default_timezone_set('Asia/Tokyo');
$affiliate = json_decode(file_get_contents("./affiliate.json"));
$id = null;
foreach ($affiliate->{date("w")} as $key=>$val) {
$str = $id?array("status"=>$affiliate->{date("w")}[$key]->txt,"in_reply_to_status_id"=>$id):array("status"=>$affiliate->{date("w")}[$key]->txt);
$res = $connection->post("statuses/update",$str);
$id = $res->id;
}
}
{
"0": [
{
"txt": ""
},
{
"txt": "2"
},
{
"txt": "3"
}
],
"1": [
{
"txt": "1"
},
{
"txt": "2"
},
{
"txt": "3"
}
],
"2": [
{
"txt": "1"
},
{
"txt": "2"
},
{
"txt": "3"
}
],
"3": [
{
"txt": "1"
},
{
"txt": "2"
},
{
"txt": "3"
}
],
"4": [
{
"txt": "1"
},
{
"txt": "2"
},
{
"txt": "3"
}
],
"5": [
{
"txt": "1"
},
{
"txt": "2"
},
{
"txt": "3"
}
],
"6": [
{
"txt": "1"
},
{
"txt": "2"
},
{
"txt": "3"
}
]
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$affiliate, argv, Asia, connection, CUI, date, foreach, gt, json_decode, lt, null, php require_once, quot, TwitterOAuth, txt, use AbrahamTwitterOAuthTwitterOAuth, val, vendor, アファリエイト, コマンドライン,
All in One SEO一括、自動入力したった。
2020.07.16
All in One SEO一括、自動入力したった。そのままです。SEO入力欄にデータを流し込みました。前処理として記事のID番号を列挙してJSONで保存しそのIDデータを使用してSEOタイトル、SEO ディスクリプション、SEO キーワードに記事のタイトル、記事内容、タグをそれぞれ流し込みました。この結果は数ヶ月ぐらいかかると思いますが、良い方向に動いていほしいものです。
ここではJSONデータは記載していませんがプログラム処理から想像出来るかと思います。
<?php
date_default_timezone_set("Asia/Tokyo");
require_once(__DIR__ . '/../wp-load.php');
class db{
public $db = NULL;
function __construct()
{
$this->db = new PDO('mysql:dbname=DBNAME;host=HOST;charset=utf8;', 'USER', 'PASS');
}
public function tbl_update($id,$title,$comment,$keyword){
//
$sdb = $this->db->prepare("select * from wp_postmeta where wp_postmeta.post_id = :id and wp_postmeta.meta_key='_aioseop_title';");
$sdb->bindParam(":id",$id,PDO::PARAM_INT);
$ret = $sdb->execute();
var_dump($sdb->rowCount());
if($sdb->rowCount()){
$sdb = Null;
$sdb = $this->db->prepare("UPDATE wp_postmeta set wp_postmeta.meta_value = :title where wp_postmeta.post_id = :id and wp_postmeta.meta_key='_aioseop_title';");
}else{
$sdb = Null;
$sdb = $this->db->prepare("INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUES (:id,'_aioseop_title',:title);");
}
$sdb->bindParam(":id",$id,PDO::PARAM_INT);
$sdb->bindParam(":title",$title,PDO::PARAM_STR);
$ret = $sdb->execute();
//
//
$sdb = $this->db->prepare("select * from wp_postmeta where wp_postmeta.post_id = :id and wp_postmeta.meta_key='_aioseop_description';");
$sdb->bindParam(":id",$id,PDO::PARAM_INT);
$ret = $sdb->execute();
if($sdb->rowCount()){
$sdb = Null;
$sdb = $sdb = $this->db->prepare("UPDATE wp_postmeta set wp_postmeta.meta_value = :comment where wp_postmeta.post_id = :id and wp_postmeta.meta_key='_aioseop_description';");
}else{
$sdb = Null;
$sdb = $this->db->prepare("INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUES (:id,'_aioseop_description' ,:comment);");
}
$sdb->bindParam(":id",$id,PDO::PARAM_INT);
$sdb->bindParam(":comment",$comment,PDO::PARAM_STR);
$ret = $sdb->execute();
//
//
$sdb = $this->db->prepare("select * from wp_postmeta where wp_postmeta.post_id = :id and wp_postmeta.meta_key='_aioseop_keywords';");
$sdb->bindParam(":id",$id,PDO::PARAM_INT);
$ret = $sdb->execute();
if($sdb->rowCount()){
$sdb = Null;
$sdb = $this->db->prepare("UPDATE wp_postmeta set wp_postmeta.meta_value = :keyword where wp_postmeta.post_id = :id and wp_postmeta.meta_key='_aioseop_keywords';");
}else{
$sdb = Null;
$sdb = $this->db->prepare("INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUES (:id,'_aioseop_keywords' ,:keyword);");
}
$sdb->bindParam(":id",$id,PDO::PARAM_INT);
$sdb->bindParam(":keyword",$keyword,PDO::PARAM_STR);
$ret = $sdb->execute();
$sdb = Null;
$this->db = Null;
return "{'id':$id,'title':'$title','comment':'$comment','keyword':'$keyword'}";
}
}
//$_POST["ID"] = 9541;
$obj = (object)json_decode(file_get_contents("./postid.json"));
foreach($obj->rows as $key=>$val){
$ID = (int)$val->ID;
$page = get_post($ID);
$title = mb_strimwidth($page->post_title,0,60,"…");
$content = $page->post_content;
$content = wp_strip_all_tags( $content );
$content = mb_strimwidth(strip_shortcodes( $content ),0,160,"…");
$keyword = array();
$posttags = get_the_tags($ID);
if ( $posttags ) {
foreach ( $posttags as $tag ) {
$keyword[] = $tag->name;
}
}
$DB = new db();
print count($keyword)>0?$DB->tbl_update($ID,$title,$content,implode(",",$keyword)):$DB->tbl_update($ID,$title,$content,"");
$DB = Null;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
39, all, Asia, class, construct, date, db, default, DIR, function, ID, in, json, lt, null, once, one, php, public, quot, require, SEO, set, timezone, Tokyo, wp-load, キーワード, ここ, それぞれ, タイトル, タグ, データ, ディスクリプション, プログラム, もの, 一括, 使用, 保存, 入力, 入力欄, 内容, 処理, 列挙, 前処理, 想像, 数, 方向, 番号, 結果, 自動, 記事, 記載,
あるキーワードをライクするTwitter API。
2019.11.06
さくらレンタルサーバー、もともとmecab(メカブ)が入っているらしい。
自動であるキーワードに対してライクする方法(Twitter API)です。
たぶん、こんなコードはなかったと思います、
過去記事「ワードプレス過去記事のツイートをボット化する方法。」と併用してお使いください。
そうでないと動きませんので…。
知り合いエンジニアさんとかに組み込んでもらってください。
<?php
function mecab_tw_like($txt="",$connection=Null){
if(!$txt)return false;
if(!is_object($connection))return false;
$cmd = "echo "$txt" | mecab";
exec($cmd, $opt, $return_ver);
//var_dump($opt);
foreach($opt as $key=>$val){
$r = explode("t",$val);
if(preg_match("/名詞/",$r[1])){
$statuses = $connection->get(
'search/tweets',
array(
'q' => $r[0],
'count' => '3',
'lang' => 'ja',
'locale' => 'ja',
'result_type' => 'recent',
'include_entities' => 'false'
)
);
if(is_array($statuses->statuses) and $statuses->statuses){
foreach( $statuses->statuses as $tweet ){
$id = $tweet->id;
$result = $connection->post(
'favorites/create',
array(
'id' => $id
)
);
}
}
}
}
}
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
API, cmd, connection, echo, exec, false, function, if, is, like, lt, Mecab, null, object, opt, php, quot, return, tw, Twitter, txt, ver, エンジニア, キーワード, コード, サーバー, さくら, ツイート, プレス, ボット, メカブ, ライク, レンタル, ワード, 併用, 方法, 自動, 記事, 過去,
google NewsをRSSで取得してjsonで返却するPHPプログラム
2018.12.22
<?php
//$_POST["sh"]...検索キーワード
if ($_POST["sh"]) {
$sh = urlencode(@xss_defence($_POST["sh"]));
$res = simplexml_load_file("https://news.google.com/news/rss/headlines/section/q/$sh/?ned=jp&hl=ja&gl=JP");
rss($res);
}
function rss(object $obj = null):void
{
if (isset($obj->channel->item)) {
if ($obj->channel->item) {
$cnt = 0;
foreach ($obj->channel->item as $item) {
$result[$cnt]["title"] = (string)$item->title;
$result[$cnt]["link"] = (string)$item->link;
$result[$cnt]["pubDate"] = (string)$item->pubDate;
$result[$cnt]["description"] = (string)$item->description;
$result[$cnt]["source"] = (string)$item->source;
$cnt++;
}
}
}
echo json_encode($result);
}
function xss_defence(mixed $val):mixed
{
if(!isset($val))return false;
if(is_array($val)){
foreach ($val as $key => $value) {
# code...
$val[$key] = strip_tags($value);
$val[$key] = htmlentities($val[$key],ENT_QUOTES);
}
}else{
$val = strip_tags($val);
$val = htmlentities($val,ENT_QUOTES);
}
return $val;
}
google NewsをRSSで取得してjsonで返却するPHPプログラムです。
ご自由にご使用ください。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
0, channel-, cnt, com, defence, file, foreach, function, gl, Google, gt, headlines, hl, https, if, isset, item, ja, jp, json, load, lt, ned, News, null, obj, object, php, POST, quot, res, RSS, section, sh, simplexml, urlencode, void, xss, キーワード, プログラム, 取得, 検索, 返却,
javascriptでテキストファイルやCSVファイルを読み込む方法。
2018.11.13
javascriptでテキストファイルやCSVファイルを読み込む方法は下記になります。
この他に、jqueryだとajaxを使用して読み込む方法などもありますが、あえて
javascriptで記述しています。
rt();
function rt(){
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET","xxx.txt",true);
xmlHttp.send(null);
xmlHttp.onload = function(){
var data = xmlHttp.responseText;
}
}
追記:アクセス数が結構あるのでサンプルを作りました。
下記のコードをお試しください。
デモページはこちらになります。
https://zip358.com/tool/demo13/ 【改良前】
https://zip358.com/tool/demo13/index2.php 【ちょっと改良】
https://zip358.com/tool/demo13/index3.php 【もうちょっと改良】
https://zip358.com/tool/demo13/index4.php 【もっと改良】
https://zip358.com/tool/demo13/index5.php 【もっともっと改良】2022年度版
※文字の中にカンマ区切りがあるのには対応してません?
"use strict";
var csv = {
load:async function(filename,id){
await fetch(filename).then(data=>data.text()).then((res)=>{
let result = (res.split("\r\n").map(value=>{
return "<tr>" + (value.split(",").map(val =>{
return "<td>" + val.slice(1, -1) + "</td>";
})).join("") +"</tr>";
})).join("");
if(result){
document.getElementById(id).innerHTML = result;
}
}).catch(m =>{
console.error(m);
});
return true;
}
}
csv.load("xxx.csv", "table");
"use strict";
var csv = {
load:async function(filename,id){
const res = await fetch(filename);
const data1 = await res.text();
let separate1 = /\r\n/;
let separate2 = ",";
let data_tbl = (data1.split(separate1)).map(function(value){
return (value.split(separate2)).map(function(value1){
return value1.slice(1, -1);
});
});
var str = "";
for (const key in data_tbl) {
str+=`<tr>`;
for (const key1 in data_tbl[key]) {
str+=`<td>${data_tbl[key][key1]}</td>`;
}
str+=`</tr>`;
}
document.getElementById(id).innerHTML = str;
return "OK";
}
};
csv.load("xxx.csv", "table");
"use strict";
var csv = {
load: function (filename, id) {
fetch(filename).then(
Response=>{
return Response.text();
}).then(data1 =>{
let separate1 = /\r\n/;
let separate2 = ",";
let data_tbl = (data1.split(separate1)).map(function(value){
return (value.split(separate2)).map(function(value1){
return value1.slice(1, -1);
});
});
var str = "";
for (const key in data_tbl) {
str+=`<tr>`;
for (const key1 in data_tbl[key]) {
str+=`<td>${data_tbl[key][key1]}</td>`;
}
str+=`</tr>`;
}
document.getElementById(id).innerHTML = str;
return "OK";
}).catch(error=>{
console.log("失敗しました" + error);
})
}
};
csv.load("xxx.csv", "table");
"use strict";
var csv = {
load: function (filename, id) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", filename, true);
xmlHttp.send(null);
xmlHttp.onload = function () {
if (xmlHttp.status === 200) {
let separate1 = /\r\n/;
let separate2 = ",";
let data1 = xmlHttp.responseText;
let data_tbl = (data1.split(separate1)).map(function(value){
return (value.split(separate2)).map(function(value1){
return value1.slice(1, -1);
});
});
var str = "";
for (const key in data_tbl) {
str+=`<tr>`;
for (const key1 in data_tbl[key]) {
str+=`<td>${data_tbl[key][key1]}</td>`;
}
str+=`</tr>`;
}
document.getElementById(id).innerHTML = str;
}
};
}
};
csv.load("xxx.csv?123", "table");
"use strict";
var csv = {
load: function (filename, id) {
var data = {};
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", filename, true);
xmlHttp.send(null);
xmlHttp.onload = function () {
if (xmlHttp.status === 200) {
let separate1 = /\r\n/;
let separate2 = ",";
let data_org = xmlHttp.responseText;
let data_en = data_org.split(separate1);
for (let d in data_en) {
data[d] = data_en[d].split(separate2);
}
//data load
var t = document.getElementById(id);
var h = "<table>";
for (var o in data) {
h += "<tr>";
for (var r in data[o]) {
h += "<td>";
h += data[o][r].slice(1, -1);
h += "</td>";
}
h += "</tr>";
}
h += "</table>";
t.innerHTML = h;
}
};
}
};
csv.load("xxx.csv", "table");
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
358, ajax, com, CSV, data, function, GET, https, javascript, jquery, new, null, onload, open, quot, responseText, rt, send, too, true, txt, var, xmlHttp, XMLHttpRequest, xxx, zip, アクセス, コード, こちら, サンプル, テキスト, デモ, ファイル, ページ, 下記, 他, 使用, 方法, 記述, 追記,