├── .gitignore
├── README.md
├── img
├── FB-f-Logo_blue_58.gif
├── FB-f-Logo_blue_58.png
└── ui.png
├── main.py
├── requirements.txt
└── views
├── __init__.py
├── form.py
├── formchatbox.py
├── formlogin.py
├── formloginfailure.py
├── libs
├── __init__.py
└── fbchat1.py
└── splash.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore compiled files
2 | *.pyc
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # fbChatPython
2 | A Tkinter based GUI to login and send messages to your Facebook friends.
3 |
4 | [](https://gitter.im/fbChatPython/Lobby)
5 |
6 | ## Getting Started
7 | * Fork the repository
8 | * Clone it to your local system
9 | * Switch to project directory
10 | * Run `pip install -r requirements.txt` for Python 2 or `python -m pip install -r requirements.txt` for Python 3 to install dependencies (may need to be root/admin user to make this work if not
11 | using a virtualenv - do `sudo pip install -r requirements.txt` or `sudo python -m pip install -r requirements.txt` accordingly instead if this is the case on Linux)
12 | * Run the command `python main.py` to make the program running
13 |
14 | ### Prerequisites
15 | * Python 2 or Python 3 ()
16 | * [fbchat](https://fbchat.readthedocs.io/en/master/) module
17 | * Basic knowledge of [Tkinter](http://effbot.org/tkinterbook/tkinter-index.htm)
18 |
19 | ## Note
20 | This app is a very basic one and various features are yet to be implemented.
21 | PRs are welcome!
22 |
23 | ## Features to be implemented
24 | * Improve UI
25 |
--------------------------------------------------------------------------------
/img/FB-f-Logo_blue_58.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/img/FB-f-Logo_blue_58.gif
--------------------------------------------------------------------------------
/img/FB-f-Logo_blue_58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/img/FB-f-Logo_blue_58.png
--------------------------------------------------------------------------------
/img/ui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/img/ui.png
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | try:
4 | from tkinter import *
5 | from views.formlogin import FormLogin
6 | from views.splash import SplashScreen
7 | from tkinter import font
8 | except ImportError:
9 | from Tkinter import *
10 | from views.formlogin import FormLogin
11 | from views.splash import SplashScreen
12 |
13 |
14 | class App:
15 |
16 | def __init__(self):
17 | self.master = Tk()
18 | self.currentWindow = FormLogin(self.master)
19 |
20 | def run(self):
21 | self.master.mainloop()
22 |
23 |
24 | if __name__ == "__main__":
25 | SplashScreen()
26 | app = App()
27 | app.run()
28 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | fbchat
2 | Pillow
3 |
--------------------------------------------------------------------------------
/views/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/views/__init__.py
--------------------------------------------------------------------------------
/views/form.py:
--------------------------------------------------------------------------------
1 | try:
2 | from tkinter import *
3 | except ImportError:
4 | from Tkinter import *
5 |
6 |
7 | class Form(Frame):
8 |
9 | def __init__(self, master):
10 | Frame.__init__(self, master)
11 | self.master = master
12 |
13 | def _initialize(self, master):
14 | pass
15 |
16 | def _initialize_view(self, master):
17 | pass
18 |
19 | def close(self):
20 | self.master.destroy()
21 |
--------------------------------------------------------------------------------
/views/formchatbox.py:
--------------------------------------------------------------------------------
1 | try:
2 | from tkinter import *
3 | from .libs.fbchat1 import *
4 | from .form import Form
5 | except ImportError:
6 | from Tkinter import *
7 | from libs.fbchat1 import *
8 | from form import Form
9 |
10 | class FormChatbox(Form):
11 |
12 | def __init__(self, master, client):
13 | Form.__init__(self, master)
14 | self._initialize(master, client)
15 | self._initialize_view(master)
16 |
17 | def _initialize(self, master, client):
18 | self.client = client
19 | self.targetFriend = StringVar()
20 | self.group = StringVar()
21 | self.broadcast = StringVar()
22 |
23 | def _initialize_view(self, master):
24 | self.master.title("fbChat")
25 | self.labelmessage = Label(master, text = "Type your message here:")
26 | self.textmessage = Text(master, width = 25, height = 5)
27 |
28 | self.friendlabel = Label(master, text = "Name of friend:")
29 | self.friendentry = Entry(master, textvariable = self.targetFriend)
30 |
31 | self.sendbutton = Button(master,
32 | text = "Send Message",
33 | command = self._on_sendbutton_clicked)
34 |
35 | self.logoutbutton = Button(master,
36 | text="Logout",
37 | command=self._on_logoutbutton_clicked)
38 |
39 | self.grouplabel = Label(master, text = "Name of Group:")
40 | self.groupentry = Entry(master, textvariable = self.group)
41 |
42 | self.broadcastlabel = Label(master, text = "Name of friend(s):")
43 | self.broadcastentry = Entry(master, textvariable = self.broadcast)
44 |
45 | self.labelmessage.grid(row = 3, sticky = W)
46 | self.textmessage.grid(row = 3, column = 1)
47 | self.friendlabel.grid(row = 0, sticky=W)
48 | self.friendentry.grid(row = 0, column = 1, sticky = W)
49 | self.sendbutton.grid(row = 4, columnspan = 2)
50 | self.logoutbutton.grid(row = 5, columnspan = 2)
51 | self.grouplabel.grid(row = 1,sticky = W)
52 | self.groupentry.grid(row = 1, column = 1, sticky = W)
53 | self.broadcastlabel.grid(row = 2,sticky = W)
54 | self.broadcastentry.grid(row = 2, column = 1, sticky = W)
55 |
56 | def _on_sendbutton_clicked(self):
57 | friend = self.friendentry.get()
58 | group = self.groupentry.get()
59 | broadcast = self.broadcastentry.get()
60 | message = self.textmessage.get(1.0, END)
61 | self.textmessage.delete(1.0, END)
62 | sendmsg(self.client, message, friend, group, broadcast)
63 |
64 | def _on_logoutbutton_clicked(self):
65 | if self.client:
66 | isSuccess = self.client.logout()
67 |
68 | if isSuccess:
69 | print("Already Logout...")
70 | self.close()
71 |
72 | try:
73 | from formlogin import FormLogin
74 |
75 | except ImportError:
76 | from .formlogin import FormLogin
77 |
78 | FormLogin(Tk())
79 |
--------------------------------------------------------------------------------
/views/formlogin.py:
--------------------------------------------------------------------------------
1 |
2 | try:
3 | from tkinter import *
4 | from .libs.fbchat1 import *
5 | from .form import Form
6 | except ImportError:
7 | from Tkinter import *
8 | from libs.fbchat1 import *
9 | from form import Form
10 | finally:
11 | from PIL import Image, ImageTk
12 |
13 | class FormLogin(Form):
14 |
15 | def __init__(self, master):
16 | Form.__init__(self, master)
17 | self._initialize(master)
18 | self._initialize_view(master)
19 |
20 | def _initialize(self, master):
21 | self.username = StringVar()
22 | self.password = StringVar()
23 | self.friend = StringVar()
24 | self.message = StringVar()
25 |
26 | def _initialize_view(self, master):
27 | self.master.title("fbChat")
28 |
29 | self.master.geometry("350x340+600+300")
30 | self.master.config(bg='#E9EBEE')
31 | self.master.resizable(0,0)
32 | fbphoto = PhotoImage(file='img/FB-f-Logo_blue_58.gif')
33 | self.master.bind("", self._on_buttonlogin_clicked)
34 | self.fbImageFrame = Frame(master,width=350,height=30,bg='#4267B2')
35 | self.fblogo = Label(master, image=fbphoto)
36 | self.fblogo.image = fbphoto
37 | self.labelid = Label(master, text="Email",fg="#365899",bg="#E9EBEE")
38 | self.labelpass = Label(master, text="Password",fg="#365899",bg="#E9EBEE")
39 |
40 | self.entryid = Entry(master, textvariable=self.username)
41 | self.entrypass = Entry(master, show="*", textvariable=self.password)
42 |
43 | self.buttonlogin = Button(master,
44 | text="Login",
45 | command=self._on_buttonlogin_clicked,bg="#3B5970",fg="#F2FFFF",
46 | cursor="hand2",activebackground="#365899",activeforeground="#F2FFFF")
47 |
48 | self.fbImageFrame.grid(row=0, column=0)
49 | self.fblogo.grid(row=1, column=0,sticky=W,pady = 10,padx=90)
50 |
51 | self.labelid.grid(row=2, column=0,sticky=W,pady = 5,padx=90)
52 | self.entryid.grid(row=3, column=0,pady=5,ipady=5)
53 |
54 | self.labelpass.grid(row=4, column=0,sticky=W,pady = 5,padx=90)
55 | self.entrypass.grid(row=5, column=0,pady=5,ipady=5)
56 | self.buttonlogin.grid(row=6, column=0, columnspan=2,pady=5)
57 |
58 | self.login_state_info = Label(self.master,text="...",bg="#E9EBEE",fg="#365899")
59 | self.login_state_info.grid(row=7,column=0,pady=5,ipady=5)
60 |
61 | def _on_buttonlogin_clicked(self, event=None):
62 | self.login_state_info.config(text="Logging you in...")
63 | self.master.update()
64 | username = self.username.get()
65 | password = self.password.get()
66 | try:
67 | client = login(username, password)
68 | self.close()
69 | try:
70 | from .formchatbox import FormChatbox
71 | except:
72 | from formchatbox import FormChatbox
73 |
74 | FormChatbox(Tk(), client)
75 |
76 | except FBchatUserError:
77 | self.close()
78 | try:
79 | from .formloginfailure import FormLoginFailure
80 | except:
81 | from formloginfailure import FormLoginFailure
82 | finally:
83 | FormLoginFailure(Tk())
84 |
--------------------------------------------------------------------------------
/views/formloginfailure.py:
--------------------------------------------------------------------------------
1 | try:
2 | from tkinter import *
3 | from .form import Form
4 | except ImportError:
5 | from Tkinter import *
6 | from form import Form
7 |
8 |
9 | class FormLoginFailure(Form):
10 |
11 | def __init__(self, master):
12 | Form.__init__(self, master)
13 | self._initialize(master)
14 | self._initialize_view(master)
15 |
16 | def _initialize(self, master):
17 | pass
18 |
19 | def _initialize_view(self, master):
20 | self.master.title("Login Error")
21 | self.master.geometry("350x200+600+300")
22 | self.master.config(bg="#E9EBEE")
23 | self.master.resizable(0,0)
24 | self.master.bind("", self._on_loginagainbutton_clicked)
25 |
26 | self.topFrame = Frame(self.master,width=350,height=30,bg="#4267B2")
27 | self.topFrame.grid(row=0,column=0,ipadx=160)
28 |
29 | self.closebutton = Button(self.topFrame,text="X",command=self._on_loginagainbutton_clicked,bd=0,\
30 | bg="#4267B2",activebackground="#4267B2",fg="#FFFFFB",highlightthickness=0,\
31 | cursor="hand2",activeforeground="#FFFFFB")
32 | self.closebutton.grid(row=0,column=0,sticky=W,padx=2,pady=3,ipadx=2,ipady=3)
33 |
34 | self.err_text = Label(master, text="Couldn't log you in. Incorrect Email/Password",\
35 | bg='#BE4B49', fg='#FFFFFB')
36 | self.err_text.grid(row=1,column=0,padx=5,pady=10,ipady=10,ipadx=3)
37 | self.loginagainbutton = Button(master,
38 | text="Try logging in Again",
39 | command=self._on_loginagainbutton_clicked,cursor="hand2",
40 | bg="#3B5998",fg="#FFFFFB",activebackground="#365899",activeforeground="#FFFFFB")
41 | self.loginagainbutton.grid(row=2,column=0,pady=30,ipady=5,padx=10)
42 |
43 | def _on_loginagainbutton_clicked(self, event=None):
44 | self.master.destroy()
45 |
46 | try:
47 | from .formlogin import FormLogin
48 |
49 | except ImportError:
50 | from formlogin import FormLogin
51 |
52 | finally:
53 | FormLogin(Tk())
54 |
55 |
--------------------------------------------------------------------------------
/views/libs/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/views/libs/__init__.py
--------------------------------------------------------------------------------
/views/libs/fbchat1.py:
--------------------------------------------------------------------------------
1 | import fbchat
2 |
3 | from fbchat import Client
4 | from fbchat.models import *
5 |
6 | def login(username,password):
7 | return fbchat.Client(username, password, max_tries = 1)
8 |
9 | def iLI(client):
10 | return client.isLoggedIn()
11 |
12 | def sendmsg(client, msg, name, groupname, broadcast):
13 | friendlist = []
14 |
15 | if (len(broadcast) > 0):
16 | friendlist = broadcast.split(',')
17 |
18 | if (len(name) > 0):
19 | if name not in friendlist:
20 | friendlist.append(name)
21 |
22 | if (len(friendlist) > 0):
23 | for eachfriend in friendlist:
24 | friends = client.searchForUsers(eachfriend)
25 | friend = friends[0]
26 |
27 | sent = client.sendMessage(msg, thread_id = friend.uid, thread_type = ThreadType.USER)
28 |
29 | if not sent:
30 | print("Message not sent to " + eachfriend + "!")
31 | if sent:
32 | print("Message sent!")
33 |
34 | if (len(groupname) > 0):
35 | groups = client.searchForGroups(groupname)
36 | group = groups[0]
37 | sent = client.sendMessage(msg, thread_id = group.uid, thread_type = ThreadType.GROUP)
38 |
39 | if sent:
40 | print("Message sent!")
41 |
--------------------------------------------------------------------------------
/views/splash.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | from tkinter import *
4 | from tkinter import font
5 | import time
6 |
7 | class SplashScreen():
8 |
9 | def __init__(self):
10 | self.master = Tk()
11 | self.master.title("Loader Anim")
12 | self.master.geometry("350x200+600+200")
13 | self.master.resizable(0,0)
14 | self.master.config(bg = "#4267B2")
15 | self.master.overrideredirect(1)
16 | self.someFont = font.Font(family='Ubuntu', size=25, weight='bold')
17 | self.empty_canvas = Canvas(self.master,width = 300,height=150,bg = "#4267B2",highlightthickness=0).grid(row = 1,column = 1)
18 | self.lab1 = Label(self.empty_canvas,bg = "#4267B2",text = "facebook",font = self.someFont,fg = "#fff").grid(row = 1,column=1)
19 | self.loader_canvas = Canvas(self.master,width = 300,height=20,bg = "#4267B2",highlightthickness=0)
20 | self.loader_canvas.grid(row = 2,column = 1)
21 | loader_value = 10
22 |
23 | while loader_value < 340:
24 | self.loader = self.loader_canvas.create_rectangle(10,5,loader_value,2,fill = "#fff",width=0)
25 | loader_value += 10
26 | time.sleep(0.1)
27 | self.master.update()
28 |
29 | time.sleep(1)
30 | self.master.destroy()
31 |
--------------------------------------------------------------------------------