飞雪团队

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

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

[复制链接]

8034

主题

8122

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26432
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
0 F  a8 X( f& p9 b' H
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>% p6 ^4 |' i1 J" P2 G/ ^
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>5 q0 ?2 t- A! L6 X/ f
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>; D" e. f2 C* _" @3 d# ?* y
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>$ p4 _- e9 D0 U. ]0 d, N
但,女朋友的命令,我是不敢违抗的……<br>
; R% u  Q! ^# n; T0 s: h<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
- Y  L9 G3 n/ f: d$ K但是睡觉也不能缺!</p>; Y. F$ J0 ~. T& N! \$ x; g
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
  c4 i( Z2 {0 i6 i. y0 m<h1 id="python登场">Python登场</h1># ~4 r, L8 X6 Y
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>& A, [6 i9 c- a
<h2 id="安装和导入">安装和导入</h2>+ {" J/ p+ J' C
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>8 P7 S: b7 {" l+ J
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
) U- Q7 J1 I: M1 U. C2 ^( a- g+ b( s  ?<pre><code class="language-p">pip install apscheduler# v+ H( z* v* U6 k9 y' w# _
pip install pyautogui# c: x. V1 @0 d3 Z3 S
</code></pre>
! O1 C5 c2 Y$ w  M! [; M<p>导入:</p>
1 b$ }; b5 m, _( e0 h: e<pre><code class="language-python">import pyautogui
$ C' J. U2 @7 r% }. Gfrom datetime import datetime
7 X1 |0 H/ F2 N4 [7 K  h/ ]  j8 a9 mfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器0 A2 m( w  E; `- c/ b: g
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
. n# e7 O& h! V8 ]% q# from apscheduler.schedulers.background import BackgroundScheduler
6 C% B+ |! H. h  w0 j6 n. W</code></pre>
( d" b% o7 t$ p1 D/ s( k<h1 id="pyautogui">pyautogui</h1>
" l  G0 M/ P6 R) D2 q; [0 t<p>首先我们来实现自动发送消息</p>
) j* y- N' z7 M) L5 H<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
" _$ X+ _6 S9 m$ [* I; F" T<p>先来做一些基本设置:</p>$ o+ F( L8 g/ ~; I4 d  I
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
; e# `; @4 x/ a* t. ~</code></pre># O& i" B2 c2 ~# {1 N
<p>然后我们登录微信,最小化。</p>+ f/ f4 Y6 ?" s5 t1 Y
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>4 y% M" }& ?9 G& {7 }- N
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)/ x) v4 ]' Q* p& Y% |
icon_position = pyautogui.position() # Point(x=148, y=879)
3 T5 I6 B. P! j9 J</code></pre>
9 T2 {$ a) W: {  L$ S' G<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>! j9 J0 T+ {- c
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
( y" \3 s2 @6 A<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751); D) j+ [1 G% a5 F7 b4 ]8 Y; J* U
entry_position = pyautogui.position() # Point(x=174, y=751)/ \& U1 N3 x" k  J: s0 o, h
</code></pre>
5 `- X) D# C4 p6 q- u  _<p>接下来,控制程序依次点击这两个点:</p>% g6 K6 F" Q' r$ S; o, ^1 n0 o
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
5 w# }; _. D$ A8 C% n! D; e# pyautogui.click(148, 879)
) [9 ^: h' ~* ]9 Gpyautogui.click(entry_position)
5 c+ s9 i& G* `- l# pyautogui.click(174, 751). h) M  }7 |3 o  A/ G2 ~9 }3 r% e
</code></pre>
, t2 P5 K* D6 X* f3 Y+ {<p>打开微信并锁定焦点后,我们开始输入文本。</p>: _' j5 `0 F1 K9 e+ |% J# S5 m
<p>输入文本可以有两种方式:</p>* y4 Z( `+ r& H, a% {; S* D
<ul>
. o  L# A: s0 _- I<li>. y2 a6 S, s2 o% U+ k/ Q
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
0 w; D+ R$ C  l, W/ S) c<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
1 d7 c/ I# s2 @</li>( T8 V  X& q7 M6 m
<li>+ i: `6 W0 [+ K, y9 T
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
  y: R* f" |$ [) Y6 c+ h; n8 B) r<p>传入字符串,但不能同时打印字母和特殊按键。</p>
' l+ A8 q. X5 x</li>
" X0 M) Z' R9 n6 S</ul>
* G/ f# |" }% r<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>6 H8 ]/ T+ A' Y! ~
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
+ ~8 j; j) {3 T" Y% T</code></pre>
& h! f$ _6 l1 \+ P  z<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
- C, y8 w! C" z- x% c- s. Y<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
4 J" T" ^' ?9 I- ^" fpyautogui.click(icon_position)
- g+ h1 R' Y+ q# f; H/ e! g6 ]pyautogui.moveTo(entry_position, duration=2)8 J& q! g% P( L5 c" [1 H- {
pyautogui.click(entry_position)# J; S* c) c5 {$ h2 y- {
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
8 s4 S: L8 l/ x/ \% V- b1 S</code></pre>
' Z. @2 ]" S9 `9 X. Q! o1 d/ P<p>看看效果:<br>; W- m7 D( K' N9 f# u8 i4 ^
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
3 L* X( R: p# y当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
/ {8 e/ \" ]' V5 G<pre><code class="language-python">import pyperclip# z6 n& p- y' Q5 M' M
/ z& _4 F- x5 K- t2 y% t6 K
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
3 g% v0 Z4 p) J  S6 ~% Zpyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
7 x) a8 t* H- l3 E( O# J4 dpyautogui.press('enter') # 按下按键
, Q! f! d) I- ~0 {' s2 Y# b</code></pre>
4 V* t3 H2 j9 h6 O<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
* [; i# t# S7 j# k3 S% T) i这样,我们便完成了自动发送微信消息的功能了。</p>
( Z( K0 m* Q1 w<h1 id="apscheduler">apscheduler</h1>
( F5 ?. Z$ A5 \$ P1 C<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
+ P" G" c( S. t0 h<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器5 i+ S3 q( c# m0 c' \: c" U
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务, f2 q- b- s4 m$ E" k9 u) u/ G. _
scheduler.start(); I, V+ ^7 S5 \7 P
</code></pre>! f7 e2 H% z, e
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>2 T, V4 }2 _0 v) B( W
<h1 id="完整代码">完整代码</h1>; N. F. V# a; T; v
<pre><code class="language-python">import pyautogui) {" h/ U$ f  J8 [  x
import pyperclip2 v3 E* ?; x  \: q) D
from datetime import datetime
) }" Y' L, b* ]- D" C2 J+ Bfrom apscheduler.schedulers.blocking import BlockingScheduler/ K' T4 e; K: z7 E) q

7 f5 C. L0 ^8 U8 vdef main():
1 l! u9 \3 r( k! y, U7 n. B        pyautogui.PAUSE = 0
% Y& j; a6 a' _$ M4 Z% f% }
2 x  m+ |9 S- f- X, H        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置% h. W" y+ L# j$ |1 {( G. {6 r
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置  \$ j/ s, R! J( L1 K8 K: v
7 v" o: f) ?# r4 ^
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选$ K& d3 c- m5 K0 E
        pyautogui.click(icon_position), P# S# c; V& u3 M
        pyautogui.moveTo(entry_position, duration=0.7)
+ ^3 K" o5 K0 N, S! G, N7 \        pyautogui.click(entry_position)
. f" v- r1 t* C/ L$ _        pyperclip.copy('快去睡觉')
  a3 @: n* _& i  s* U        pyautogui.hotkey('ctrl', 'v')
! ?* O: P3 m( x" t7 d        pyautogui.press('enter')
  {6 l5 O8 b! ^( m; k/ S    pyperclip.copy('笨猪')) G1 B/ {( d* z" s0 B. _& L
        pyautogui.hotkey('ctrl', 'v')
7 P$ {! s) p- E+ V  m: e# [        pyautogui.press('enter'): j, d& @1 s: L* ]
   
' m7 Z( G, I& q1 s0 J/ E. Kscheduler = BlockingScheduler() # 实例化' ?6 n9 X% ?' V: n; g
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
4 {$ i, O7 x" T: `" `% T$ Ischeduler.start()
4 s* B; f- i8 O/ O" }</code></pre>) z6 y! Z  c' L# I/ G
<p>完成啦!现在可以去睡觉了。</p>  z" u7 F0 l- Q8 m# t9 A4 ~. ?
<h1 id="结果">结果</h1>% e" F" J( p- @3 u9 A7 @6 `
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
' P( ]/ m* |9 P* S. n<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
- J" D  D2 Y9 y: C- [! @' l3 o3 N<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>- P) @: a! D0 q/ X" ?
<hr>
: T2 s, a$ `, R" l<h1 id="---the-end---">-- the End --</h1>" b0 E$ }, n( k: D2 p( H
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>3 c  t) |9 C8 Z) o, T
<p>打个小广告:作者CSDN博客主页:<br>. L, K# }3 [1 \/ T! i/ G
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>1 [: m: q5 a; L7 {

# ^" Y0 u- n. c- P1 ]- ]6 h
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-12-5 10:42 , Processed in 0.066028 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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