飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 14977|回复: 0

女朋友让我深夜十二点催她睡觉,我有Python我就不干

[复制链接]

7952

主题

8040

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26186
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
  d! d  p* _& o; X
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>9 v' S, E  S1 o: [, r
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>, ^# c* A. K8 n, @* H
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
" Y. L  i+ Q; L7 K. W8 ]<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>' f9 H! H" r& v( k- i7 c; S8 F
但,女朋友的命令,我是不敢违抗的……<br>: Y; Z: u1 j9 r0 F% ?0 ]# S) m
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>, z5 e5 s. t/ m- Z) C0 T
但是睡觉也不能缺!</p>
- t' P% k# ^+ y! t<p>这时候我们该怎么办呢?是时候让Python登场了!</p>9 D3 g! _6 ^/ |/ L
<h1 id="python登场">Python登场</h1>& b9 a4 ]. _6 n8 B, _% Z1 ?
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>5 p# G0 U, U/ a% k1 L
<h2 id="安装和导入">安装和导入</h2>
, V9 a) b9 h# r<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>7 [7 K+ d  ?: |( I
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
0 x& N; ]: N0 X: j6 b$ |<pre><code class="language-p">pip install apscheduler' k  R2 u6 H- Q+ I4 Q
pip install pyautogui
" F4 K( L- g% I- U3 g</code></pre>, h0 m7 N% N  i6 S! A
<p>导入:</p>
. P# d: d% y3 ]# v<pre><code class="language-python">import pyautogui- h. D3 I- {3 y) X3 G
from datetime import datetime: i1 F$ C  v, v) n) p; G' k
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
1 N7 o! I1 t( E3 e( t, K' F# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:9 s; [  i- p' K, l
# from apscheduler.schedulers.background import BackgroundScheduler
3 A% ?1 N( b, u/ T</code></pre>' V; M6 u% Y! _; E1 J2 \) x
<h1 id="pyautogui">pyautogui</h1>' I5 T3 R- i$ ~5 ?8 k' O& Z
<p>首先我们来实现自动发送消息</p>2 ^  `& r0 B. J
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
* N( O, {! u  X. B9 `<p>先来做一些基本设置:</p>
3 z) a, A+ J. G3 o- m* L; ^<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快& u$ k) k1 f* t( S. \! R
</code></pre>
) N$ p5 |' {: A4 e; z<p>然后我们登录微信,最小化。</p>
' x' Z- I) o( Q) O4 v<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
3 \  z3 x& o7 M; G) @<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
  u: P2 j; ]5 q! f6 z$ iicon_position = pyautogui.position() # Point(x=148, y=879)
& l/ Y: y" i/ n# k* A* H</code></pre>' @7 F! |% B- N5 [8 C
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>% M  a/ t5 @- ]
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
" k) Q5 j% f# N5 s! v$ Y8 A* F<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)  d( o6 P1 z3 U/ _+ B1 _4 `1 T
entry_position = pyautogui.position() # Point(x=174, y=751)
3 w: y- Y) L5 F</code></pre>: z- T# F5 s. {( i5 u; S& `  ]
<p>接下来,控制程序依次点击这两个点:</p>, `# b7 \1 {# ?3 w; w
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
7 F5 _, u3 V( Z  h& S+ f6 @# pyautogui.click(148, 879)/ O3 `7 {% H7 h  J' ?
pyautogui.click(entry_position)
# V' X0 X3 {0 h4 o& t6 c1 J# pyautogui.click(174, 751)) e/ q8 |9 ?" \2 ?' ]3 Z: O& v7 ]
</code></pre>
/ [6 @9 r$ b( u; m- h  H<p>打开微信并锁定焦点后,我们开始输入文本。</p>% g1 W. Y; f# P9 r6 I
<p>输入文本可以有两种方式:</p>
' |: T7 R. f/ l1 @; K$ b7 y, G<ul>( y2 Q. y/ ]$ X$ @& j. {( S
<li>. B' ?3 R- a; s- J+ U  D
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
0 @, J, e2 r1 w# ~2 h$ Y4 u<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>+ N6 \* D) C* E% B
</li>
# H5 j: ?' m" M9 i& D" V<li>; s$ p% V) j. H0 l) Q' a
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>; e; ]" i& I; s" G
<p>传入字符串,但不能同时打印字母和特殊按键。</p>: s8 W! z# |5 J+ d, ]2 }
</li>
) T1 `6 h8 n& c" z$ W  q</ul>2 J$ j+ B% |9 @; c
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>; y: b, b. v7 {4 g+ P; ^; e4 ~
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
+ z9 q# ]: T, Q  E  v</code></pre>( g' J! J: d8 m, D' U/ O3 _" f4 K
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>$ i4 ~1 `# A) e+ [/ J* Z
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
' }) K7 N0 g6 V& b9 ]pyautogui.click(icon_position)
. q7 N- M% G! ?# d5 w8 X9 dpyautogui.moveTo(entry_position, duration=2)
2 ?  M# h% Q- z6 |/ b% X* Ppyautogui.click(entry_position)
  a4 o. j$ n3 G4 {/ ?pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选' E8 t; |1 ?0 y& F9 |2 Q
</code></pre>
& v, ^( v8 {* c  X<p>看看效果:<br>; U0 z( p4 R! @$ K7 D) J5 A4 G
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
( L0 L6 q. L9 N9 ~* [1 u9 A当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
2 @' K4 N0 M9 s5 [6 `3 f! `<pre><code class="language-python">import pyperclip* p" I" u9 s, O2 O4 X- c
( R9 J3 R$ H7 ^5 v/ Y  t* X, b% h
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
2 `% R  w! I' ]- K* @pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
: _+ f# M! X! x' W( \7 t6 Tpyautogui.press('enter') # 按下按键- F; ^3 |6 J' m/ p5 u; c
</code></pre>
" |4 |+ c8 h8 M! O<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
% ]/ d4 F! n9 y+ r8 l" A这样,我们便完成了自动发送微信消息的功能了。</p>
3 @6 l5 Q7 ]" v/ i9 X+ o<h1 id="apscheduler">apscheduler</h1>. g0 w$ `& N7 D9 j7 ?
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
7 I" u. ?" B$ a+ z' L/ ~/ s1 w<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器! M% q% f6 D5 O4 X
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
( F* t: x& N8 x4 z! Vscheduler.start()
" M8 b- P- H" Z</code></pre>
: H1 Z7 C/ R  `5 m( N) N/ y<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>0 F5 a6 u5 N# h: ^- `' S0 i# }+ l
<h1 id="完整代码">完整代码</h1>
# S, d4 l8 l( {- R8 P, C. |<pre><code class="language-python">import pyautogui6 d) O, w) D" @% F
import pyperclip
# B1 d# [& }5 D# [1 t9 P) tfrom datetime import datetime
* j! n% l1 Q) afrom apscheduler.schedulers.blocking import BlockingScheduler
/ e( ^% E+ C% G7 m/ L/ z' Q. t3 b/ F7 q; w9 j
def main():; z" p/ X5 }, e
        pyautogui.PAUSE = 03 {. C& I8 z9 `2 y8 W0 n$ k
8 g+ X' A: H+ V
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
, z; P) q1 l9 i        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
2 `$ v) x3 p0 w0 ]& I0 v7 `
/ M, J  b% O2 |/ V' M        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
) K. R5 r7 c0 X6 c$ b8 @4 c        pyautogui.click(icon_position), `  z' Q4 @; E# {/ q) C
        pyautogui.moveTo(entry_position, duration=0.7)4 G+ {0 }( V- p$ y2 i
        pyautogui.click(entry_position)
# P0 z  |! b, d! a! m, u+ B        pyperclip.copy('快去睡觉')
8 V- C$ W1 C# m$ K' _2 E0 X0 Y        pyautogui.hotkey('ctrl', 'v')% i  F" z4 M3 d6 F
        pyautogui.press('enter'). O0 l- s- R1 O/ Z, k# V
    pyperclip.copy('笨猪'): X5 J, _+ T) X2 k: [; ~  J8 s/ {* [; N: X
        pyautogui.hotkey('ctrl', 'v')
5 O" n$ S7 K" u$ @6 \) Q        pyautogui.press('enter')9 S: D4 {* M' F, Y! x0 D2 @8 v; e
    6 @4 f7 E6 ^4 k; k2 `
scheduler = BlockingScheduler() # 实例化+ A4 }8 b; ~* b2 L6 u
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务: v9 [! _9 _; O- D4 Z
scheduler.start()
6 K  }5 h2 w; |( e: |; z% Z</code></pre>
2 u. X! S' D/ z+ b<p>完成啦!现在可以去睡觉了。</p>7 D4 o# L$ a4 r& B8 |9 g- c
<h1 id="结果">结果</h1>2 t6 N: f. ]' q$ p" K+ X' r
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>$ d1 y6 n. r$ j4 O1 a( d
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
) w  T: r& t/ P5 X5 Z<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
( k% X$ }6 ~/ C0 \# d, C<hr>( R, I6 J0 s; x% q8 T7 L% }: a
<h1 id="---the-end---">-- the End --</h1>
3 l6 T0 L5 r& R, u  j  b<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p># Y" x2 y% n9 ~$ f( `9 \
<p>打个小广告:作者CSDN博客主页:<br>
8 }, g+ j; `( ]0 j<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>) Z0 |- S5 k! W0 n2 x

( _. @( D- E2 c. ^# \) l+ c% c
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2025-11-23 22:35 , Processed in 0.060875 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表