1 | <?php |
||
2 | /** |
||
3 | * Telegram Bot |
||
4 | * |
||
5 | * @author mybsdc <[email protected]> |
||
6 | * @date 2020/2/3 |
||
7 | * @time 15:23 |
||
8 | */ |
||
9 | |||
10 | namespace Luolongfei\Lib; |
||
11 | |||
12 | use GuzzleHttp\Client; |
||
13 | |||
14 | class TelegramBot |
||
15 | { |
||
16 | const TIMEOUT = 34.52; |
||
17 | |||
18 | /** |
||
19 | * @var TelegramBot |
||
20 | */ |
||
21 | protected static $instance; |
||
22 | |||
23 | /** |
||
24 | * @var string chat_id |
||
25 | */ |
||
26 | protected $chatID; |
||
27 | |||
28 | /** |
||
29 | * @var string TelegramBot token |
||
30 | */ |
||
31 | protected $token; |
||
32 | |||
33 | /** |
||
34 | * @var Client |
||
35 | */ |
||
36 | protected $client; |
||
37 | |||
38 | public function __construct() |
||
39 | { |
||
40 | $this->chatID = config('telegram.chatID'); |
||
0 ignored issues
–
show
|
|||
41 | $this->token = config('telegram.token'); |
||
0 ignored issues
–
show
It seems like
config('telegram.token') can also be of type array . However, the property $token is declared as type string . Maybe add an additional type check?
Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly. For example, imagine you have a variable Either this assignment is in error or a type check should be added for that assignment. class Id
{
public $id;
public function __construct($id)
{
$this->id = $id;
}
}
class Account
{
/** @var Id $id */
public $id;
}
$account_id = false;
if (starsAreRight()) {
$account_id = new Id(42);
}
$account = new Account();
if ($account instanceof Id)
{
$account->id = $account_id;
}
![]() |
|||
42 | |||
43 | $this->client = new Client([ |
||
44 | 'headers' => [ |
||
45 | 'Content-Type' => 'application/x-www-form-urlencoded' |
||
46 | ], |
||
47 | 'cookies' => false, |
||
48 | 'timeout' => self::TIMEOUT, |
||
49 | 'verify' => config('verifySSL'), |
||
50 | // 'http_errors' => false, |
||
51 | 'debug' => config('debug') |
||
52 | ]); |
||
53 | } |
||
54 | |||
55 | protected static function instance() |
||
56 | { |
||
57 | if (!self::$instance instanceof self) { |
||
0 ignored issues
–
show
|
|||
58 | self::$instance = new self(); |
||
59 | } |
||
60 | |||
61 | return self::$instance; |
||
62 | } |
||
63 | |||
64 | /** |
||
65 | * 发送消息 |
||
66 | * |
||
67 | * @param string $content 支持markdown语法,但记得对非标记部分进行转义 |
||
68 | * @param string $chatID 可单独指定chat_id参数 |
||
69 | * @param bool $isMarkdown 默认内容为Markdown格式,传否则为Html格式 |
||
70 | * @desc 注意对markdown标记占用的字符进行转义,否则无法正确发送,根据官方说明,以下字符如果不想被 Telegram Bot 识别为markdown标记, |
||
71 | * 应转义后传入,官方说明如下: |
||
72 | * In all other places characters '_‘, ’*‘, ’[‘, ’]‘, ’(‘, ’)‘, ’~‘, ’`‘, ’>‘, ’#‘, ’+‘, ’-‘, ’=‘, ’|‘, |
||
73 | * ’{‘, ’}‘, ’.‘, ’!‘ must be escaped with the preceding character ’\'. |
||
74 | * 如果你不转义,且恰好又不是正确的markdown语法,那 Telegram Bot 就只有报错了您勒 |
||
75 | * |
||
76 | * 官方markdown语法示例: |
||
77 | * *bold \*text* |
||
78 | * _italic \*text_ |
||
79 | * __underline__ |
||
80 | * ~strikethrough~ |
||
81 | * *bold _italic bold ~italic bold strikethrough~ __underline italic bold___ bold* |
||
82 | * [inline URL](http://www.example.com/) |
||
83 | * [inline mention of a user](tg://user?id=123456789) |
||
84 | * `inline fixed-width code` |
||
85 | * ``` |
||
86 | * pre-formatted fixed-width code block |
||
87 | * ``` |
||
88 | * ```python |
||
89 | * pre-formatted fixed-width code block written in the Python programming language |
||
90 | * ``` |
||
91 | * 需要注意的是,普通markdown语法中加粗字体使用的是“**正文**”的形式,但是 Telegram Bot 中是“*加粗我呀*”的形式,更多相关信息请 |
||
92 | * 参考官网:https://core.telegram.org/bots/api#sendmessage |
||
93 | * 另外我干掉了“_”、“~”、“-”、“.”和“>”关键字,分别对应斜体、删除线、无序列表、有序列表和引用符号,这几个我可能用不上:) |
||
94 | * |
||
95 | * @return bool |
||
96 | */ |
||
97 | public static function send(string $content, $chatID = '', $isMarkdown = true) |
||
98 | { |
||
99 | if (config('telegram.enable') === false) { |
||
100 | system_log('由于没有启用 Telegram Bot 功能,故本次不通过 Telegram Bot 送信。'); |
||
101 | |||
102 | return false; |
||
103 | } |
||
104 | |||
105 | if ($isMarkdown) { |
||
106 | // 这几个我可能用不上的markdown关键字我就直接干掉了 |
||
107 | $content = preg_replace('/([.>~_-])/i', '\\\\$1', $content); |
||
108 | } |
||
109 | |||
110 | $telegramBot = self::instance(); |
||
111 | |||
112 | $response = $telegramBot->client->post( |
||
113 | sprintf('https://api.telegram.org/bot%s/sendMessage', $telegramBot->token), |
||
114 | [ |
||
115 | 'form_params' => [ |
||
116 | 'chat_id' => $chatID ? $chatID : $telegramBot->chatID, |
||
117 | 'text' => $content, |
||
118 | 'parse_mode' => $isMarkdown ? 'MarkdownV2' : 'HTML', |
||
119 | 'disable_web_page_preview' => true, |
||
120 | 'disable_notification' => false |
||
121 | ], |
||
122 | ] |
||
123 | ); |
||
124 | $rp = json_decode((string)$response->getBody(), true); |
||
125 | |||
126 | return $rp['ok'] ?? false; |
||
127 | } |
||
128 | } |
Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.
For example, imagine you have a variable
$accountId
that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to theid
property of an instance of theAccount
class. This class holds a proper account, so the id value must no longer be false.Either this assignment is in error or a type check should be added for that assignment.