飞雪团队

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

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

[复制链接]

4822

主题

4910

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16784
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式

3 ^* V6 p$ r% I6 ]<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>" Z$ {( j8 a& f" W, J& a. {6 H
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
& c1 C5 K1 g& E3 Y不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
* U" e/ n; q# \6 g. C<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>/ `4 w' E' y$ h
但,女朋友的命令,我是不敢违抗的……<br>" X: w3 C% r# `# f
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>/ z8 i, r( a8 ?7 ]+ W# ~6 @
但是睡觉也不能缺!</p>1 \/ H3 Z, j+ R# G
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
6 d) Y9 p: X! ^$ q2 {<h1 id="python登场">Python登场</h1>  |4 T* Z7 }( N) G/ j2 C2 ~& u/ o
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
8 f5 O5 m. M9 `+ x: m; B) _<h2 id="安装和导入">安装和导入</h2>9 H# t3 |+ }5 w* a# i
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>$ T; M+ `$ Y0 p& o  G7 \2 O8 ^
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>( |5 e3 A) w& s( Q
<pre><code class="language-p">pip install apscheduler$ O3 N( r1 r; Y7 B/ y
pip install pyautogui/ K: C" g& L2 Q: e
</code></pre>
- D4 q* }0 j% u6 c<p>导入:</p>
* h7 r: [6 w, y  h<pre><code class="language-python">import pyautogui6 Y7 I' R3 p6 o  f% v  h' H
from datetime import datetime5 @" ~1 T9 w0 P3 B- F
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
! F/ t2 ?# x0 x# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:8 v) V6 j  V7 i% z
# from apscheduler.schedulers.background import BackgroundScheduler5 L& d' G" p/ @. [6 n
</code></pre>
' z+ b. ?5 p: F# h  f<h1 id="pyautogui">pyautogui</h1>
/ I& _/ Y2 m) D$ [<p>首先我们来实现自动发送消息</p>
( k( ]% x  z) x' h+ h/ A0 w+ A: k: L<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>9 Z. ^3 n- ~8 S  a% c4 B& o
<p>先来做一些基本设置:</p>: u, v! K8 ~! I9 `' O9 _; H
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
0 a" d4 q/ O7 m- c2 d: h0 }</code></pre>  t* \+ O7 j3 E; F. f7 M5 ?' i9 x
<p>然后我们登录微信,最小化。</p>: C8 F, ~+ T0 V' @9 Q8 D& S) L5 c) g
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
7 n/ v* Z2 T7 w: o0 G: Q" v" t* ~<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)8 C9 a) r# I# C: f# f* m7 \, ^
icon_position = pyautogui.position() # Point(x=148, y=879)
+ d: E/ E/ ?( H& S$ ~5 e</code></pre>6 o  N3 C9 f( i# J
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
4 G4 O" D' ^2 N) C3 g+ a3 F<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
0 f6 T# G; w3 b  k<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)) L. O8 ^, M: w, r. m% y
entry_position = pyautogui.position() # Point(x=174, y=751)
) O8 F. r$ o3 o</code></pre>
0 _2 W$ i5 z+ X1 L) ]<p>接下来,控制程序依次点击这两个点:</p>
. E- D  A) s* {4 T" x- y1 k<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击( F2 Z8 Q9 a+ f7 H+ i
# pyautogui.click(148, 879): l& \$ e% ?0 p1 W- Q  I: l" b
pyautogui.click(entry_position)
( ?5 \+ I2 t: p  M) Q  B' J# pyautogui.click(174, 751)! e8 q' s, q4 Q) }: d
</code></pre>1 }. T! b2 P; D) F: g! X2 ?, j
<p>打开微信并锁定焦点后,我们开始输入文本。</p>" B' z0 O$ C! }6 l
<p>输入文本可以有两种方式:</p>
' R* i% D3 [, v<ul>
4 G- Y4 I  d6 h& B) I7 O<li>1 J' v4 R7 r$ U6 Y% e" S
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>  W) x! [) c8 u
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>' X( s" }) W0 g: u: B; [- G
</li>
( X5 y* d. O1 A  u4 Y<li>
3 o' t8 b* O& X<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>8 [' R3 |# e& A3 }1 V, q7 l. c
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
9 I( A: q- k$ [* A' ^  W</li>4 S2 \) E4 W9 a- F" V9 W8 O
</ul>
" U6 c/ t) d, ~& Q  M7 B<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>2 k; Y6 X' l. L" H" s- u
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间. e3 a1 a/ Z# i6 G4 I
</code></pre>
2 }+ S$ j% g% J; L<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>. M5 [' \1 U2 z2 t2 x4 r7 [$ c# H
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
! X9 [$ L: N. |/ J% ^% epyautogui.click(icon_position)
- V% V2 t  }! p! u5 n& Kpyautogui.moveTo(entry_position, duration=2)# q% v$ P6 R% q! N1 u- q0 w) @
pyautogui.click(entry_position)( x5 D7 v( W: q) x! e# [0 V* I/ B6 y
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选4 s9 T( M$ `' J3 x# ]/ _2 W3 t' T
</code></pre>
" h2 X7 |4 C" O/ X7 ?9 h<p>看看效果:<br>
; f/ i9 o+ p% ?; ~' l1 z4 L- c; f<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>! |6 ^8 p8 g' e! ?+ i: w3 ]
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
; V3 Z' S) |3 l" _, R  ~<pre><code class="language-python">import pyperclip
4 q1 ~6 s- `, t5 Y: @
" o5 v2 n& N2 c# S' d3 cpyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制3 ~& t- N& L( t
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
6 _( q. |9 Z+ s/ _% J( cpyautogui.press('enter') # 按下按键
: `6 ~! P/ W' O6 D& D</code></pre>
5 g4 I6 i5 `$ s, e( V<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
( T# j6 B" N  a+ }: n5 L7 O" V" P这样,我们便完成了自动发送微信消息的功能了。</p>
( ]7 @9 w' r) R1 J, @6 ]3 C6 B<h1 id="apscheduler">apscheduler</h1>6 B- Q2 r% z6 ~% h2 D  _
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>7 h4 A# `# r, e
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
" o6 e( B/ R% A& c3 T+ z* bscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
' t, A  ?% x3 T$ ?- uscheduler.start()
9 z, E/ Z8 W  }- I! i5 G</code></pre>5 T" e0 R+ V# K1 K
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>4 e8 e. V' v' O8 ]0 V
<h1 id="完整代码">完整代码</h1>
# @, N! a$ c+ p! J<pre><code class="language-python">import pyautogui. `& C/ y; f- i4 }2 q
import pyperclip) S4 a6 D1 N3 l
from datetime import datetime
+ }+ |9 W" A0 z5 r, G: sfrom apscheduler.schedulers.blocking import BlockingScheduler
6 y6 x# T: H5 a2 B; _- t1 v" [9 o% ]9 h$ V7 u5 D6 U% ]# k
def main():
/ E& _# E3 n/ H: b& C        pyautogui.PAUSE = 0
( C* [8 S3 K0 i( W5 Q5 a! Z" b: g; V: }  `0 n! J: l6 u
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
% D: {0 F7 ]; }# Q) P" j+ y: \( T9 C        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
7 f: \% S0 n2 M* Q
% p: l9 j6 l) C7 u: T        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选2 U5 z. _1 P2 @+ U0 m! m  S1 w3 f
        pyautogui.click(icon_position)2 X9 r" `2 K8 ?' @9 [& ~- @
        pyautogui.moveTo(entry_position, duration=0.7)# O. |4 A, _5 t4 ?$ W, ?3 k( W
        pyautogui.click(entry_position), }/ m8 @5 u4 `( b# q( p
        pyperclip.copy('快去睡觉')* H. s2 M1 A  A1 m+ J
        pyautogui.hotkey('ctrl', 'v')+ ?3 w& g% A. l. L4 B, q+ Y1 h/ j$ F
        pyautogui.press('enter')
: H0 ]8 L$ j8 G' K( \1 |    pyperclip.copy('笨猪')
  Y% I5 p' L3 T9 w2 x2 G        pyautogui.hotkey('ctrl', 'v')& n% K% E: V" x
        pyautogui.press('enter')' y& L' }  W2 e4 ?7 m
   
9 ]; l9 Y% R) S* a, z( z( x  {/ cscheduler = BlockingScheduler() # 实例化
) Z. ^! E" A- G" W( g$ D! w4 Escheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
  j" H$ f& Z# K' e  O4 ]4 |scheduler.start()
' w( h+ C7 r9 S) |/ H6 m* v: S</code></pre>: s: g- ?: A/ |9 z8 j
<p>完成啦!现在可以去睡觉了。</p>
: H( m  v; i7 r! G8 a. {<h1 id="结果">结果</h1>
/ D7 o3 t4 e* h5 _* P, O<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
3 e1 a, ]! D7 E<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>/ _, u6 x% w3 d! y1 _& z: m( ~
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
- K* d3 y7 d+ n- x" P# X<hr>
8 g8 }0 k4 A! Q9 R! w<h1 id="---the-end---">-- the End --</h1>( m  C/ r3 t; {
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
; b; ]  o- G# y<p>打个小广告:作者CSDN博客主页:<br>
  B0 L$ c  o7 g5 X5 F<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>$ u/ m( I' s; B" {9 A
" W$ X# O. e5 f- T
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2024-9-20 00:32 , Processed in 0.089880 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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