数珠繋ぎのツイートシステムに予約機能を付けました😂 #php #code

2022.10.07

Logging

おはようございます、偏頭痛持ちは雨が降るが一番大変です☔。

先日、数珠繋ぎのツイートシステムを作ったのですが、そのシステムに予約機能を付けました。尚、TwitterAPIのバージョン2でスケジュールのパラメーターが今のところ無いですね。これから先、機能が付くかも知れないですが今のところ無いようです。因みにソースコードは近日中にQiitaGithubにUPします。此処ではソースコードの一部を掲載します(※記事を更新しました下へスクロール🫠)。

Twitter API v2 ツイート数珠繋ぎ

尚、crontabでPHPファイルを叩くようにしています、あと注意事項ですが予約を一度した投稿については変更等は出来ません、編集機能等の機能追加の予定はないです。また、予約管理はsqlite3を使用して管理しています。

<?php
date_default_timezone_set('Asia/Tokyo');
ini_set("display_errors",0);
require_once "./data/tw-config-v2.php";
require_once "../vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class tw
{
    var $connection = null;
    var $pdo = null;
    function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
    }
    function db_connection()
    {
        try {
            //code...
            $res = $this->pdo = new PDO("sqlite:./data/tw-tweets-db.sqlite3");
        } catch (\Throwable $th) {
            //throw $th;
            //print $th->getMessage();
            $res = false;
        }
        return $res;
    }

    function timecheck($timeonoff, $times)
    {
        if (!$timeonoff) return true;
        $n = new DateTime();
        $t = new DateTime($times);
        return $t <= $n ? true : false;
    }

    function pickup_tweets(mixed $tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        if (!$times) return false;
        $obj = (object)[];
        $times = preg_replace("/\-/", "/", $times);
        $times = preg_replace("/T/", " ", $times);

        if ($this->timecheck($timeonoff, $times)) {
            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;
            }
        } else {
            return $timeonoff ? $this->save_sqlite($tw_text, $timeonoff, $times, $id): true;
        }
    }

    function save_sqlite($tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        if ($this->db_connection()) {
            try {
                //code...
                if (isset($tw_text) && is_array($tw_text)) {
                    foreach ($tw_text as $key => &$value) {
                        if (preg_replace("/[ | ]/", "", $value)) {
                            $stmt = $this->pdo->prepare("insert into tweets (tw_id,user,times,tw_text)values(:tw_id,:user,:times,:tw_text)");
                            $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                            $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                            $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                            $stmt->bindValue(":tw_text", $value, PDO::PARAM_STR);
                            $stmt->execute();
                        }
                    }
                }
                $this->pdo = null;
                return true;
            } catch (\Throwable $th) {
                //throw $th;
                return false;
            }
        }
    }
    function tweets_load(string $id = "")
    {
        if (!$id) return false;
        try {
            //code...
            $value = null;
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("select * from tweets where user = :user order by times,tw_id asc;");
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $res = $stmt->execute();
                $value = $res ? $stmt->fetchAll() : false;
                $this->pdo = null;
            }
            return $value;            
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
    }
    function tweets_update(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "",mixed $tw_text="")
    {
        try {
            //code...
            if(!preg_replace("/[ | ]{0,}/","",$tw_text))return false;
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("update tweets set tw_text = :tw_text where tw_id = :tw_id and user = :user and times = :times");
                $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                $stmt->bindValue(":tw_text", $tw_text, PDO::PARAM_STR);
                $stmt->execute();
                $this->pdo = null;
            }
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
        return true;

    }

    function tweets_delete(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        try {
            //code...
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("delete from tweets where tw_id = :tw_id and user = :user and times = :times");
                $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                $stmt->execute();
                $this->pdo = null;
            }
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
        return true;
    }

    function bat_tweets(mixed $value = null)
    {
        if (!$value) return false;
        $obj = (object)[];
        $t = "";
        foreach ($value as $key => $val) {
            if ($this->timecheck(1, $val["times"])) {
                $obj = ($val["times"]<>$t)? ($this->connection->post("tweets", ["text" => $val["tw_text"]], true)
                ) : ($this->connection->post("tweets", ["reply" => ["in_reply_to_tweet_id" => $obj->data->id], "text" => $val["tw_text"]], true)
                );
                $this->tweets_delete($val["tw_id"], 1, $val["times"], $val["user"]);
                $t = $val["times"];
            } else {
              //  var_dump($val);
              //  break;
            }
        }
    }
}

if ($argv[0]) {
    $tw = new tw();
    $value = $tw->tweets_load(xss_d($argv[1]));
    $tw->bat_tweets($value);
}
function xss_d($val = false)
{
    if (is_array($val)) {
        foreach ($val as $key => $value) {
            $val[$key]  = strip_tags($value);
            $val[$key]  = htmlspecialchars($val[$key]);
        }
    } else {
        $val  = strip_tags($val);
        $val  = htmlspecialchars($val);
    }
    return $val;
}

追記:予約編集機能なども付けました🙄。

GithubとQittaのリンクはこちらです。
Github:https://github.com/taoka-toshiaki/tweets-system-box1
Qitta:https://qiita.com/taoka-toshiaki/items/5ef12b60b267742bf584

タグ

2, , 39, Asia, Code, crontab, date, default, github, ini, lt, php, qiita, Se, set, Sqlite, timezone, Tokyo, TwitterAPI, UP, コード, これ, システム, スクロール, スケジュール, ソース, ツイート, ところ, バージョン, パラメーター, ファイル, 一部, , 予定, 予約, 事項, , 使用, 偏頭痛, , 先日, 変更等, 大変, 投稿, 掲載, 数珠繋ぎ, 更新, 機能, 機能等, 此処, 注意, 管理, 編集, 記事, 近日, 追加, ,

あの映画がゲームになりました。アバターが凄い完成度です!!

2021.06.23

Logging

あの映画がゲームになりました。アバターが凄い完成度です!!2022年発売予定です、ゲーム予告画面を見て頂ければわかると思いますが、かなり凄いことになってます。映画の世界観をそのままゲームに写し込んだような体験ができそうです。

Avatar: Frontiers of Pandora – First Look Trailer | PS5

https://www.massive.se/project/avatar-frontiers-of-pandora/

因みに2022年にはジェームズ・キャメロン監督がメガホンを撮ったアバターの続編が上映される予定です、こちらも目がはなせないですね?。尚、続編の舞台は水が関係しているらしいのですがどうなんでしょうね。

タグ

2022, avatar-frontiers-of-pandora, https, Massive, project, Se, www, アバター, かなり, キャメロン, ゲーム, こちら, こと, ジェームズ, メガホン, 上映, 世界観, 予告, 予定, 体験, 完成, 映画, , 画面, 発売, 監督, , 続編, 舞台, 関係,

オブジェクト指向を勉強しないとあっちの道には戻ったとしても大変そうだなぁ。

2015.04.02

Logging

愚痴をこぼしてみた(´Д`) :{こども的な発言(´Д`):真面目な話してもブログって面白く無いです。}
オブジェクト指向を勉強しないとあっち(プログラミング職)の道に戻ったとしても大変だという事が今の段階でわかっています。VisualStudioC++かJavaが大体の現場(開発)でベースとなる言語だ。それがわかっていないと「使えねぇなぁ?」と愚痴をこぼされること間違いなく、WEBではcakePHPやWordPressを難無くこなさないと「使えねぇなぁ?」と愚痴られること間違いない。WEBはまだ使っているからOKなのだが、ソフトウェア系は間違いなく一からの出直し状態なのだ。それなり覚えて履歴書にサンプルコードでも貼り付けて「おいら、これぐらいしか出来ません」って送らないと採用されそうにない。採用されても現場で使い物にならなければ左遷だしなという思いのなか、プログラマーの求人を見ては妄想にふけってます。
もしプログラマーの職を当たるとしてもある程度できるようになってからって・・・現状、時間ないから。ぼちぼちあたってみようと思います。たぶん、こっちの道で県内企業は難しいと思うので県外になりそうな予感がします。なんか、職歴がアダになっている今日このごろ、生半可にそういう職業が多いと違う分野にはじかれやすいという事が先わかってきた。この専門分野で働かないといけないのかな・・・・正直、人間関係がドロッとしていてやなんですよね。
今まで幾分、楽してきた分、つけが大きい・・・・。
ちなみに一番向いていない職業はトップテンは製造業だったりする。この専門分野は全然向いていない事がわかっている。のび太くん以上に不器用なんで(´Д`)・・・・す。気分的には運送業者で働きたいだけど、職歴で逆に落とされるだよね、インテリ嫌うみたいな感じで結構、嫌っている人がいる。一番向いている分野はWEB業だという事も知っているけど高知県にその業者さんが幾分すくない、片手で数えるぐらいしか無いのだ。求人出ていないし・・・。結論から言えば県外しか無い。そしてこの業種、小さい会社の方でもすごい人がいる確率が妙に高い業種でもある。尚且つ、会社が若干、不安定な部分がある。そこがコワイ(WEBは小さい会社しか働いたことがないので大きな会社のことは知らないです。)。ソフトウェアは正社員で小さい会社と大きな会社でも働いたことがあるので、どんな感じなのかはわかるですね・・・・・。結果、WEBが向いているがわかっている人間関係を気付くのはWEBが良いですね。ソフトウェアは癖がある人が多い、それぐらい揉まれる事が多いのかも。
 
県外へ行きたくないこともないけど何だか行ったら片道切符になりそうなんです。そうなると将来の事とか考えてしまうわけですね・・・。
あれこれ考えてしまうと前へ進めないので行き当たりばったりに受けてみることにします。
 
こらからソフトウェアで働く新人達へ
SEは分かんないが口ぐせ、ここでは本気で分かんないSEと能力を見極めるために分かんないを口ぐせで言うSEがいる事を忠告しときます!。分かんないを分かんないで答えているとコイツ使えねぇなぁ?と思われます。逆に分かった口を聞くと( ・ω・) ?でもなく仕事ふられます。SEとのコミニケーションは大切です、自分の命を削られますから慎重にお答えください(´Д`)。実力が有ればコミニケーション無くとも生きていける業種でもあります。
なお、プライドの戦いに巻き込まれそうになったら空でも見てあげましょう。この頃、馬鹿なフリしていると楽だなぁと言うことをシミジミ感じていたんですけど馬鹿なフリし続けるとほんとうにのび太くんみたいになっちゃった自分がいます。そろそろスネヲにならないといけない時期なのかもなぁ・・・・・・orz
 
そろそろ、キャラ変えしようかなwww。

子供じみた話でした~(笑)。
 

タグ

cakePHP, orz, Se, アダ, インテリ, オブジェクト指向, コイツ, コミニケーション, コワイ, シミジミ, スネヲ, トップテン, プライド, プログラマー, 使い物, 口ぐせ, 左遷, 愚痴, 片道切符, 職歴,