飞雪团队

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

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

[复制链接]

5746

主题

5834

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

3 d0 b+ o7 }$ I2 k9 s4 ^<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>
. W& x; Q/ g# y. d" f1 z<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>) v  g6 I  B9 ]/ M  H- w
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
9 w& S7 e! C0 O" E. L! f; a5 B<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
5 w" K. l% |# r  Z  V+ H但,女朋友的命令,我是不敢违抗的……<br>6 a6 u0 b& D8 o7 ~! T
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
4 O9 _! Z9 @* `8 z# a但是睡觉也不能缺!</p>0 D! t; P  o! R2 g3 ~# ^9 v
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>) o' L2 L) c/ Z' d* ^% o/ J
<h1 id="python登场">Python登场</h1>  D, x( m' K) [: ?& z) Z* A
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
5 G" L; k( }* _& a/ k& x<h2 id="安装和导入">安装和导入</h2>9 g" _8 u0 T1 A& H2 q9 h( f5 u
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>6 u% S3 p" V9 y; E
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>, b. a- [* m- Y( q$ U5 ^
<pre><code class="language-p">pip install apscheduler
- n% P) M, i) L! I! \/ {; p; T. |pip install pyautogui
; W& T, Z. b# O0 v7 ]4 i2 U0 G</code></pre>9 z/ h& R( p, p) o4 N
<p>导入:</p>
) t  j4 I1 K, A) }! x6 U<pre><code class="language-python">import pyautogui
0 }" V$ `- `( |- M( n: }8 }7 yfrom datetime import datetime. Y- d6 e0 d& _0 H, X
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
9 R. R5 f/ z" h  H/ c8 _, s8 z( F* Z# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:) v0 q7 e4 f: k. q! v
# from apscheduler.schedulers.background import BackgroundScheduler
9 ?% p! D/ {3 a, l</code></pre>$ `/ [3 u" S& \
<h1 id="pyautogui">pyautogui</h1>
2 B7 m  {% g$ M  O6 H" R. ]2 L* w<p>首先我们来实现自动发送消息</p>
* w1 L, l8 i- }) K<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>2 w' [& Y: Z+ D
<p>先来做一些基本设置:</p>
1 G% G9 a+ I* ?# }2 V<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快$ @, T9 m  z0 Q* {' m$ a5 _2 X9 D
</code></pre>
# j4 f( G: c7 j2 k<p>然后我们登录微信,最小化。</p>" l  p+ u3 U$ Z9 {- T
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
" ^$ C- K$ M3 M' D0 g  I0 l( \, K2 O<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)( X$ k* h$ Z$ @/ X& H" I
icon_position = pyautogui.position() # Point(x=148, y=879)
, b5 m0 J' o+ ]/ t: Z</code></pre>
" d3 ?; e4 h' ~+ h  h<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>- K1 U/ ~: y$ B; e# G0 ]' L2 A
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>& v. Z/ F) F0 O9 ^+ m
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)9 S! c" z5 ?; b. S" r# Q& L2 G$ v
entry_position = pyautogui.position() # Point(x=174, y=751): u5 A6 B' j0 R8 t/ @9 r
</code></pre>8 v0 `) J% ~$ a6 e/ u5 M
<p>接下来,控制程序依次点击这两个点:</p>
; W* _  W, V6 ]( @& e. J9 _; Y! ?  l<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击& F$ j0 u  z& O8 K
# pyautogui.click(148, 879)) a; A* U  G" j" W; Y$ Q% z
pyautogui.click(entry_position)1 d$ A! X0 w1 Y: S
# pyautogui.click(174, 751)
2 M4 r0 t- ?2 }( n2 I</code></pre>
: \( H5 y2 j6 t<p>打开微信并锁定焦点后,我们开始输入文本。</p>
6 `# L) `+ M3 ^" i& {  \<p>输入文本可以有两种方式:</p>$ V, g7 O" u6 w( T  Q
<ul>) ?* o  J* j5 U  j; ^
<li>4 z* m7 L% h4 m& N; Y, e5 e- `. f
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
' ~0 Y$ r$ O1 @9 p<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
1 d( [( j' ~; Y" q, b, k. R2 F</li>; x- A6 `4 q$ S8 y) j3 D
<li>
6 W: W( B3 h1 l+ N<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>& b8 d% n, N) @4 n( |5 o" F
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
& o8 y, M8 E/ i( O/ i/ s</li>; i2 `5 B& q5 w+ E* I* B
</ul>6 \; B- m0 u6 R4 ^) K6 ?0 p4 \
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
0 J. c6 G* n/ q& h) T<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
8 f; M# _2 f% C4 V1 z; X" C( U4 E</code></pre>/ x# n. O2 e) T* c! D& A
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>; v- p- j' O! H7 _7 L
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
! E6 M# B( t6 w' F7 \  Ppyautogui.click(icon_position)
4 @) g) i$ H( H' S) kpyautogui.moveTo(entry_position, duration=2)9 H% ~0 c# \" W- `2 e5 z2 A: y! N
pyautogui.click(entry_position)) b* P+ W+ k" [
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
, x$ c" t/ D$ n5 ]. J9 U</code></pre>
6 B( d: J" M6 b9 h3 s" C/ a<p>看看效果:<br>; G( i- x7 v4 h0 P4 b" e
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
7 V4 Y$ L1 [+ M9 u$ e) E" p. {, e当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>1 A) r9 c2 ~" C! ^* z
<pre><code class="language-python">import pyperclip
* d$ L0 y: o3 U0 b5 W* `) L/ D: s
  i* k; s4 A( T- Ipyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制7 M6 X. c7 K2 s( N: s# R- h
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
% u4 ?; b) A' E$ J9 J  Hpyautogui.press('enter') # 按下按键
2 b' H% f$ b2 z. `2 A/ S3 |</code></pre>
* a& d& a9 r9 r4 w! h, E/ s<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>" E4 B/ |$ k; u) P# s
这样,我们便完成了自动发送微信消息的功能了。</p>- s$ ~0 _+ s7 w0 O5 `$ q; b4 b: q
<h1 id="apscheduler">apscheduler</h1>: m. E0 X( }- w' |1 C0 y
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
8 i6 W# y+ E* R6 @<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器  w; R* ~* d! ~. }9 [! A9 B
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务' l) P3 U3 S" P1 q0 z
scheduler.start()
& P) Y# b1 q6 n/ `$ U) O</code></pre>! d6 v; K/ v3 ?) |3 n* O
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>; Q4 \9 L9 C. k; E
<h1 id="完整代码">完整代码</h1>
: E9 M! o* |- |" c& {" M# v<pre><code class="language-python">import pyautogui
& s& N8 E# I# l9 s( K3 C( B3 Mimport pyperclip. c6 ~7 f6 J/ O
from datetime import datetime
: r+ |* O7 C% E& [8 V$ s8 Bfrom apscheduler.schedulers.blocking import BlockingScheduler
( P3 p( g6 C( M1 M
7 m6 |) y2 P# m% h! ndef main():5 l! S& Q3 d9 f6 R1 }" q
        pyautogui.PAUSE = 01 P/ }! u7 J( H% H' j
3 z% r" `" H$ `
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置, B. @5 \! D4 u$ a0 ^
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置$ d" x" N4 f) G  s/ @# \; _
, }# t4 O# l+ y( X
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
4 b) z5 o7 h9 ~/ w9 I: q7 Z% @        pyautogui.click(icon_position)
# W* R/ \5 p; R$ ?: G3 {        pyautogui.moveTo(entry_position, duration=0.7); m7 V5 E+ x$ e7 _6 Z/ i3 `5 E& o
        pyautogui.click(entry_position)
, e) e( Z# o5 E2 f        pyperclip.copy('快去睡觉')
4 f- d. s8 j" }; o9 ]        pyautogui.hotkey('ctrl', 'v')
* L* r* ]9 ^. I4 x5 S5 k( W        pyautogui.press('enter')* c9 X$ k8 u. y5 ~
    pyperclip.copy('笨猪')
2 l/ G4 A" ~2 {7 r- x6 O! l        pyautogui.hotkey('ctrl', 'v'): f; f) d, H* `+ R2 q2 m
        pyautogui.press('enter')% a. i0 m3 y! ~3 a. V$ t0 d% m
   
. }* V$ J: A! c# X2 {; Kscheduler = BlockingScheduler() # 实例化$ G4 y$ W8 S  e3 q, e& Q  I. [* Q1 n
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
1 h' k9 I) w, N3 T: e5 wscheduler.start()
; Q. R! E2 P, {1 U% K6 i</code></pre>. V3 P) a" ^/ H9 {4 J+ ^
<p>完成啦!现在可以去睡觉了。</p>
2 n6 P1 n, |/ _& ]6 l8 S- ]6 u7 z<h1 id="结果">结果</h1>
; A7 \) k" A1 D: f5 v<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
( a+ W# r) R4 ~" \<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br># `( U, S  Q7 h+ P, m
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
) L* o9 u3 B2 M<hr>
0 e" S$ ^% v2 C. F( r) p, }5 e/ }+ o# J<h1 id="---the-end---">-- the End --</h1>( K4 m$ F+ e% D9 P' k/ Z
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
: @: C) E- k' `1 G" Z" `7 P<p>打个小广告:作者CSDN博客主页:<br>0 C/ l4 ]# @% B0 W* ^
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>7 D; O6 L+ A+ W$ t

  d; M0 c; Z5 u* F, E; g' u
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-1-26 17:51 , Processed in 0.074397 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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